日期:2014-05-20  浏览次数:20907 次

java 中继承和protected修饰符的问题
第一个包package1中我建了个父类A,其中有一个protected修饰的属性b.  

然后在第二个包package2中建了一个类B继承了A.  

这个时候我用父类引用子类对象时,也就是A   x   =   new   B();时,对象属性x.b却访问不到.  

但是直接用子类的引用实现子类对象时,即B   x   =   new   B();x.b是可以访问的.  

而protected是只要是子类都可以访问的,为什么第一种方法不可以访问?还有到底A   x   =   new   B();的意思是什么?  

请高手解答,小弟很迷惑

------解决方案--------------------
我认为应该是这样的,protected是只要是子类都可以访问的,但是A x = new B();并没有实例化A的一个子类,而只是创建了一个A的对象,实现了B。所以x即没有成为一个A的子类的对象也没有实现A这个父类,所以无法使用protected定义的变量。回答得不一定准确,请高手指正。
------解决方案--------------------
看一下这个
http://blog.qingdaonews.com/v/9222/archives/2007/138988.html

另外protected修饰的具有包访问权限,你的两个类不在同一个包中,所以不能被访问到
------解决方案--------------------
这些都是编译时进行的静态检查.
x定义为A类型,那么编译时候就认为x是A类型的(x是一个存放类A的对象地址的引用型变量),跟x的实际类型没有关系.
另外A类型只能知道谁是其超类,但并不能知道谁是其子类.
所以在package2的B类型中x去调用protected的b就相当于一个去调用一个默认权限的b,
因为不在一个包内,所以自然无法调用.
而将x定义为B类型,x调用b时,编译器会检查x时候在B类中,或者在A类中
结果是确实在,所以可以调用.

至于static,如果b是static的,那么x.b是相当于A.b,在B中访问protected的A.b,理所当然