【JavaSE】protected访问权限问题

问题提出

在自定义类使用Object类的clone()方法时,可能会出现如下情况:

Object oa=new Object();
Object ob=oa.clone();
//报错:'clone()' 在 'java.lang.Object' 中具有 protected 访问权限
复制代码

Object是所有类的默认父类,那么问题就出在protected修饰符的访问权限上

由于Object类位于java.lang包下,下面演示父子类位于不同包和相同包内的情况来分析

举例演示

构造如下两个类:(其中test()方法返回new Car())

classDiagram
Car <|-- Ford
Car : +String desc
Car: #test() Object
Ford: -prove() void

1. Car类和Ford类在相同包内

private void prove(){
    Ford fa=(Ford)new Car().test();
}
//不报错
复制代码

2. Car类和Ford类在不同包内

private void prove(){
    Ford fa=(Ford)new Car().test();
}
//报错:'test()' 在 'com.test.car.Car' 中具有 protected 访问权限
复制代码

3. 两类仍在不同包内,test()改为静态方法

protected static Object test(){……}
private void prove(){
    Ford fa=(Ford)Car.test();
}
//不报错
复制代码

可以看到,改为静态方法后,调用test()不再报错。由此可知,当父子类不在同一个包时,不能通过实例变量调用protected方法,但是可以调用protected的静态方法(无需实例就可调用)。变量的调用同理,举例过程省略

总结

  • protected修饰的属性和内部类,对自己、本包和子类可见
  • 对于和父类在相同包内的子类,protected和public等效
  • 对于和父类在不同包内的子类,只能访问继承于父类的protected成员,而不能访问父类实例本身的protected成员

参考博客

blog.csdn.net/qq_38962004…

猜你喜欢

转载自juejin.im/post/7052686372985012237