protected修饰符详解

 

转载于https://www.cnblogs.com/haojiejiejie/p/8762768.html

protected这个修饰符,各大参考书都会这样说:访问权限为类内,包内和子类,因此在父类中定义的方法和成员变量如果为protected修饰的,是可以在不同包中的子类进行访问的,示例代码如下:

复制代码

1 package cn.tedu.object.a;
2 
3 public class A {
4     
5     protected void m(){
6         System.out.println("A m~~~");
7     }
8 
9 }

复制代码

复制代码

 1 package cn.tedu.object.b;
 2 
 3 import cn.tedu.object.a.A;
 4 
 5 public class B extends A {
 6     void callM() {
 7         m();
 8         super.m();
 9         B b = new B();
10         b.m();
11     }
12 }

复制代码

如上代码所示,class B继承了class A,但是两个类位于a、b两个不同的包中,此时class B可以直接访问class A中的protected修饰的方法。一共有三种方法访问:

第一种为第7行,直接调用;

第二种为第8行,加super关键字;其实前两种是等效的。

第三种为第9、10行,实例化一个对象进行调用。

那么问题来了,如果说在b包中新建一个class C,并且有如下代码,会报错吗?

复制代码

 1 package cn.tedu.object.b;
 2 
 3 import cn.tedu.object.a.A;
 4 
 5 public class C extends A {
 6 
 7     void callM() {
 8         m();
 9         super.m();
10         B b = new B();
11         b.m();     //The method m() from type A is not visible
12     }
13 
14 }

复制代码

会报错!那为什么会报错呢?

因为b.m()这种调用属于子类对象调用,并不是子类调用。

这个是非常需要引起注意的。因此,当创建子类对象调用父类的protected成员变量时,必须要注意:子类对象和子类是对应的!

通过这个例子其实也可以看出来,当一个包外子类继承保护成员时,该成员在这个子类内实际上变为私有。

事实上,除了以上三种调用父类protected成员变量的方法外,其余都是会报错的!

包括用超类实例去访问。代码如下:

复制代码

 1 package cn.tedu.object.b;
 2 
 3 import cn.tedu.object.a.A;
 4 
 5 public class B extends A {
 6     
 7     void callM() {
 8         A a=new A();
 9         a.m();  //The method m() from type A is not visible
10     }
11 
12 }

复制代码

同样的,会报错!因此,可以得到结论:

包外子类有权访问超类成员,它指子类继承该成员,然而,这并不意味着包外子类能够使用超类实例的引用访问该成员。

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值