Protected访问权限

protected访问权限

注:protected 既包括protected 域,又包括protected 方法,以下统称为protected!

       看 到protected,我们想到的可能是:protected 既提供包访问权限,同时对继承自该类的所有子类(或子类的下级子类)提供访问权限 !这句话是没有错的,不管子类与父类是否位于同一包中,子类的对象都可以访问protected成员,因为这些成员已经带到子类中来了!

      本文之所以要对protected单独作出讨论,是因为protected并不是上面所提到的那么简单,还有许多情况是我们没碰到过的,这其中包含着陷阱,一不小心,就会触发异常!

      我们可以把对protected成员的访问分成两种情况,一种是创建子类对象,并且用该子类对象来访问protected成员,这个在本文第一段已提到 !
       这里,我们来讨论另一种特殊的情况:当子类与父类位于不同包中,在子类中创建父类对象 ,并用此父类对象 来访问protected成员时,就会抛出一个异常!正如以下程序中看到的:

package A;        //父类所在的包

public class Father {  
       protected int i = 5;             //父类中的protected 域
       protected void test() {          //父类中的protected方法
        System.out.println(this.i);
       }
    
}
==================================================================================
package B;       //子类与父类位于不同的包中
import A.Father;     //导入父类

public class Son extends Father {
public static void main(String[] args) {
     Father f = new Father();      //创建父类对象
     System.out.println(f.i);      //此处会抛出错误
     f.test();       //此处也会抛出同样的错误
}
}
  

我们看到上面的程序会抛出两个错误,原因就在于:当子类与父类位于不同包中时,父类中的protected成员,对于父类本身是不可访问的,只有子类对象才可以访问!上面的程序我们可以把会出错的那两句改成:   

         Son t = new Son();
         System.out.println(t.i);
         t.test();  
这样就不会出错!

=======================================================================

在上面的例子上,再做一点修改,把Father 中的test()改为protected  static   void test()

然后在Son类中创建Father f = new Father();

此时,f 仍然不能访问f.i,但是f却可以访问test(), 即用f.test()时,不会出错,原因是:

因为test() 是static Method   , static method 调用 不需要通过对象的实例,跟写成 Son.test() 是一样的效果 !

 

===========================总结======================================
      当父类与子类位于同一包中时,不管是子类对象还是父类对象都可以访问 protected,但是它们的意义是不一样的;对于子类对象,之所以可以访问是因为:子类从父类继承了protected成员,理所当然可以访问;父类 对象(在子类中创建的)之所以可以访问是因为protected提供了包访问极限!


        当父类与子类位于不同包中时,protected成员就只能通过子类对象 来访问(因为protected对于子类是可见的),而父类对象不再可以访问!不过,可以访问static 成员(因为protected的包访问极限已失去作用

转载地址:http://blog.youkuaiyun.com/smqjzzm1988/article/details/7564557

 

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值