被赋予子类对象值的超类对象如何执行子类的重载方法?

问题描述 投票:0回答:2
class A
{
    private int m;
    public void display()
    {
        System.out.println(m);  
    }
}
class B extends A
{
    int n;
    B(int b)
    {
        this.n = b; 
    }
    public void display()
    {
        super.display();
        System.out.println(n);
    }
}
class trial
{
    public static void main(String args[])
    {
        A a = new A();
        B b = new B(10);
        a = b;
        a.display();
    }
}

在上面的代码中,调用a函数的变量display()如何执行子类display()-子类display()的类型为B,并且不应该存在于具有此类型的对象中A。我对此表示怀疑,因为显然超类变量可以引用子类对象。但是,他们将无法访问子类中存在的元素(变量,函数等)。但是以上代码违反了该原则。

java inheritance overloading derived-class base-class
2个回答
0
投票

我有这个疑问,因为显然超类变量可以引用子类对象。但是,他们将无法访问子类中存在的元素(变量,函数等)。但是以上代码违反了该原则。

这是不正确的。请通过https://docs.oracle.com/javase/tutorial/java/IandI/polymorphism.html

请注意,在a.display()语句中,它是B的实例,在其上调用了display()


0
投票

在您的代码中,执行以下代码a = b;变量a指向B对象。由于A是B的超类,因此它可以保存Child Class实例的引用。等效于A b = new B(10);现在,如果我们调用b.display();

// B的display()的版本被调用。

这在JAVA中称为运行时多态。使用它可以覆盖子对象中的父类方法。但是您不能访问Child类的实例变量或仅在Child类中存在的方法。

请阅读https://www.geeksforgeeks.org/dynamic-method-dispatch-runtime-polymorphism-java/

© www.soinside.com 2019 - 2024. All rights reserved.