我试图使用父类引用子类对象。根据Complete Reference Java,父类可以引用子类,但它只能访问已经在父类中声明的那些字段(完整参考java第8版,第166页,第二段)。
根据完整参考文献
重要的是要理解它是引用变量的类型 - 而不是类型
它引用的对象 - 确定可以访问哪些成员。那是,
当一个子类对象的引用被分配给一个超类引用变量时,你会
只能访问超类定义的对象的那些部分。这就是plainbox的原因
即使它引用BoxWeight对象也无法访问权重。如果你考虑一下,这个
有道理,因为超类不知道子类添加了什么。这是
为什么前面片段中的最后一行代码被注释掉了。这是不可能的
一个Box引用来访问权重字段,因为Box没有定义一个。
现在我正在使用这个例子。 父类 Box.java
public class Box{
int length;
int breadth;
int height;
Box(int length, int breadth, int height){
this.length = length;
this.breadth = breadth;
this.height = height;
}
public void getAll(){
System.out.println("Length"+this.length+"\nBreadth"+this.breadth+"\nHeight"+this.height);
}
}
儿童班 BoxWeight.java
public class BoxWeight extends Box{
int weight;
BoxWeight(int length, int breadth, int height, int weight){
super(length,breadth,height);
this.weight = weight;
}
public void getAll(){
System.out.println("Length"+this.length+"\nBreadth"+this.breadth+"\nHeight"+this.height+"\nWeight"+this.weight);
}
public int getWeight(){
return this.weight;
}
}
实施班级
public class Implementation{
public static void main(String args[]){
Box simpleBox = new Box(10,10,23);
BoxWeight boxWeight = new BoxWeight(10,10,10,30);
System.out.println("box result");
simpleBox.getAll();
System.out.println("box weight result");
boxWeight.getAll();
simpleBox = new BoxWeight(10,10,10,560);
System.out.println("Child class reference result");
simpleBox.getAll();
//System.out.println(simpleBox.getWeight());
}
}
输出
box result
Length10
Breadth10
Height23
box weight result
Length10
Breadth10
Height10
Weight30
Child class reference result
Length10
Breadth10
Height10
Weight560
我的问题是当我使用父对象引用子类时,为什么可以通过父类对象访问子类的成员变量。根据完整的参考文献java,这不应该发生。
答案 0 :(得分:0)
由于getAll()
是公共实例方法,因此它是“虚拟的”:BoxWeight
中的实现会覆盖 Box
中的实现。
你误解了你正在阅读的段落。 Box
课程不会以任何方式“引用”BoxWeight
或BoxWeight.weight
或BoxWeight.getAll()
;相反,您只是致电simpleBox.getAll()
,而且simpleBox
是BoxWeight
的实例,getAll()
的相关实现是来自BoxWeight
的实现。< / p>
答案 1 :(得分:0)
在上面的示例中,通过父类对象访问子类的成员变量???
将BoxWeight
对象分配给simpleBox
(Box类引用变量)后,simpleBox
仅访问了方法getAll()
。调用的getAll()
方法属于类BoxWeight
。之所以发生这种情况,是因为getAll()
方法在超类Box
和subcalss BoxWeight
中都存在,具有相同的签名,这是方法覆盖的标准。所以子类(BoxWeight)对象simpleBox
会覆盖getAll()
方法。
答案 2 :(得分:0)
感谢大家的支持。实际上我得到了答案,由于动态方法调度,这件事情正在发生。 感谢