java中子类的超类引用

时间:2015-01-11 19:30:49

标签: java inheritance

我试图使用父类引用子类对象。根据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,这不应该发生。

3 个答案:

答案 0 :(得分:0)

由于getAll()是公共实例方法,因此它是“虚拟的”:BoxWeight 中的实现会覆盖 Box中的实现。

你误解了你正在阅读的段落。 Box课程不会以任何方式“引用”BoxWeightBoxWeight.weightBoxWeight.getAll();相反,您只是致电simpleBox.getAll(),而且simpleBoxBoxWeight的实例,getAll()的相关实现是来自BoxWeight的实现。< / p>

答案 1 :(得分:0)

在上面的示例中,通过父类对象访问子类的成员变量???

BoxWeight对象分配给simpleBox(Box类引用变量)后,simpleBox仅访问了方法getAll()。调用的getAll()方法属于类BoxWeight。之所以发生这种情况,是因为getAll()方法在超类Box和subcalss BoxWeight中都存在,具有相同的签名,这是方法覆盖的标准。所以子类(BoxWeight)对象simpleBox会覆盖getAll()方法。

答案 2 :(得分:0)

感谢大家的支持。实际上我得到了答案,由于动态方法调度,这件事情正在发生。 感谢