【protected】JAVA关于protected的权限问题


前言

关于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()方法");
    }
}

总结

以上就是我今天研究了一下就写下来,哪里不对请指出来,只是简单分享一下,顺便也是一个记忆的过程

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值