/**
*假设A,B,C三个类都不在相同的包下,并且假设以下编辑器不会报错
*/
public class A{
public void fun() {
}
}
public class C extends A{
@Override
protected void fun() {//假设这里编译可以通过
}
}
public class B{
public static void main(String[] args){
A c = new C();
c.fun();
//因为c为A类型,所以可以调用fun(),但是在运行时,c肯定是调用自身的fun(),又因为c中fun()为protcted修饰,B和C又不在同一个包下,所以C中fun()只能由其子类调用,所以会出现问题
}
}
其实在向上转型的过程中,如果重写的权限修饰符小于父类的权限修饰符,会出现问题,还有private修饰的方法不能被覆盖,其实private修饰的方法已经隐士的声明了final。
引出一个问题,protected权限修饰符
1.子类和基类在同一个包下,被声明为 protected 的变量、方法和构造器,除了能够被自己的实例访问外,也可以被其子类的实例访问。
2.子类和基类不在同一个包下,protected修饰的,不能自己的实例访问,但是可以被子类的实例访问。
//1.不再同一个包下
public class A{
protected String name = "zyt";
}
public class B extends A{
public static void main(String[] args){
System.out.println(new B().name);//zyt
//在不同包下,自己的实例却访问不了,出现编译不通过
System.out.println(new A().name);
}
}
//2.在同一个包下
public class A{
protected String name = "zyt";
}
class B extends A{
public static void main(String[] args){
System.out.println(new B().name);//zyt
System.out.println(new A().name);//zyt
}
}
总结
- private:只有在当前类的内部才能被访问
- 缺省:可以在同一个包下的任何类访问.
- protected:除了可以在同一个包下任何类中访问外,在不同包下的类可以通过继承该类,通过子类实例来访问。注意:也只有子类实例可以访问,自己本身的实例也不可访问。
- public:可以在任何类中访问。