前言
关于protected的权限问题做一个简单的描述及验证`
提示:以下是本篇文章正文内容,下面案例可供参考
一、protected权限是什么?
被protected修饰的成员对于本包和其子类可见(记住这句话对子类可见,也就是说不同包之间访问必须有继承关系),如果看着概念有点迷那我们可以做一些简单的验证来理解。
二、验证
1.验证其被protected修饰
代码如下:注意:四个类都不在一个包里
package top.dyt.corejava.day02.a;
public class A {
protected void aVoid(){
System.out.println("访问到我啦!");
}
}
package top.dyt.corejava.day02.b;
import top.dyt.corejava.day02.a.A;
public class B extends A {
public static void main(String[] args) {
new B().aVoid();//调用到了
}
}
package top.dyt.corejava.day02.c;
import top.dyt.corejava.day02.d.D;
public class C {
public static void main(String[] args) {
new C().aVoid();//这句报错,访问不到,为什么?*问题保留
new D().aVoid();//这句报错访问不到,为什么?***问题保留
}
}
package top.dyt.corejava.day02.d;
import top.dyt.corejava.day02.b.B;
public class D extends B {
public static void main(String[] args) {
new D().aVoid();//访问到了,为什么? **问题保留
}
}
2.问题解答
第一个问题为什么在B创建实例B能调用到aVoid()方法,在C里面却不行?
前面我们说了被protected修饰后只有本包和子类可访问,注意是子类,你必须要继承才能访问到。
第二个问题为什么D类没有继承A类,但是可以访问到A类的?
这个很简单因为你D类虽然没有继承A类但是你继承了B类而B类继承了A类,这个不用多说,但是这能说明如果想要访问你必须要跟A类有直接过间接的继承关系。
第三个问题为什么明明D继承了B类B继承了A类,但是我去创建D的实例还是没办法调用到A里面的aVoid()方法?
这个很重要这个就是最难的地方了
没错D是继承了B类B继承了A类,但是注意位置
你在C里面创建D的实例去了调用A里面的方法可以吗?
仔细想想你虽然创建了D的实例但是你在C里面怎么去拿A里面的东西能呢?,A和C压根就没有关系也不再同一个包下,我们说了被protected修饰的成员对于本包和其子类可见,你一没有在本包下二没有继承关系,就算你想通过D来调用那你也得去继承D呀否则凭什么让你访问到,如果能访问到还有protected还有什么意义。
最极端的例子:一个类里有n个私有属性,你想都没想就去创建这个类的实例去点标访问这个类里面的属性,你能访问到吗?显然不能,这就验证了你在C类里去实例别的类的对象去点标访问A的方法,两者根本一点关系都没有,那指定访问不到!
还有一个问题我们可以想象假如我在我在D里重写了A的aVoid()方法,那么在C里面创建实例点标访问能访问到吗?
显然也不能因为就算你重写了这个A里的aVoid()方法,那也可以说你个D是毫不相干,除非你在重写的时候将修饰符设为公开,可以看看下面代码!
package top.dyt.corejava.day02.d;
import top.dyt.corejava.day02.b.B;
public class D extends B {
public static void main(String[] args) {
new D().aVoid();//访问到了
}
@Override
//注意假如这里的修饰符是protected那么你在其他包的类里还是访问不到,除非继承。
public void aVoid(){
System.out.println("重写了A的aVoid()方法");
}
}
总结
以上就是我今天研究了一下就写下来,哪里不对请指出来,只是简单分享一下,顺便也是一个记忆的过程