关于protected权限的子类访问方式
引入
听老师讲课说到Object类的clone()方法,其声明方法是protected修饰的。protected修饰的可见性在本类,同包类,子类中皆可见。但子类clone()方法使用时,却不能直接调用Object类的clone()方法,而是需要进行重写,这个问题令我很迷茫。
public Object clone() throws CloneNotSupportedException{
return super.clone();
}
前置芝士
学习出处:
https://blog.csdn.net/blacktal/article/details/81198579
https://blog.csdn.net/asahinokawa/article/details/80777302
通过学习我认识到,protected修饰并不只是被同一包中的所有类和不同包中的子类访问那么简单。
直接总结一下,详细实例看出处
子类可以通过继承获得不同包父类的protected权限成员变量和成员方法,在子类中可以直接访问
在子类中可以通过子类的对象访问父类的protected成员变量和方法
在子类中反而不能通过父类的对象实例访问父类的protected成员变量和方法
在子类中不能通过其他子类的对象访问父类的protected成员变量和方法
在与子类同包的其他类中不能通过子类的对象访问父类的protected成员变量和方法
子类可以在自己这里直接调用父类protected修饰的成员变量和方法,但是若在别的类中使用子类.clone()
,protected修饰的就不可见(同第5条)
解决
所以为了能在其他类中调用clone()方法,必须通过在子类中重写把clone()方法的权限提升并且实现Cloneable接口
在自定义子类A类体中调用Object的clone()方法的问题不再讨论,不能这么使用