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

java中protected所属类子类中问题
Java protected 访问控制符能被用于方法和成员变量。
有的地方说,能被该类的子类所访问,子类可以和父类不在一个包中。 但是对于如下的第2个例子怎么与这个话靠呢 ?

============================
//Bird.java------------------------------ 
package birdpack;
public class Bird{
protected int nFeathers;

}

============================
例1:能理解,可以用如上的话来解释。
//Duck1.java----------------------------- 
package duckpack;

import birdpack.Bird;

public class Duck1 extends Bird{
public void setn(int duck1n){
//在子类中直接访问父类中的protected变量
nFeathers=duck1n;
}
}

例2:怎么理解 ?怎么跟如上的话靠近呢 ?这个怎么编译可以通过呢?
//Duck2.java------------------------------

package duckpack;

import birdpack.Bird;

public class Duck2 extends Bird{

public void construct(int newduck2){
Duck2 d2 = new Duck2();
//在子类中通过子类的对象访问父类中的protected变量,这个是可以通过编译的,为什么?
d2.nFeathers=newduck2;
}
}

既然Duck2.java,那为什么Duck3.java不可以呢

//Duck3.java------------------------------
package duckpack;

import birdpack.Bird;

public class Duck3 extends Bird{

?public void construct(int newduck3){
??Bird b = new Bird();
??//子类中用父类对象反而不能访问父类中的protected变量,为什么?跟Duck2.java有什么区别吗?
??b.nFeathers=newduck3;
?}
}

------解决方案--------------------
引用:
楼上,protected只能子类可用,跟包没有关系

protected是子类和包的访问权限,第二个能通过是通过继承实现,第三个你虽然new出了Bird,但是他没有实现继承关系,而且不在同给一个包中,这个时候这个变量就相当于private