现在的位置: 首页 > 综合 > 正文

protected

2013年12月07日 ⁄ 综合 ⁄ 共 1716字 ⁄ 字号 评论关闭

注: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的包访问极限已失去作用)

 

 

抱歉!评论已关闭.