【问题标题】:How can a superclass object which is assigned the value of a subclass object execute an overloaded method of subclass?分配了子类对象值的超类对象如何执行子类的重载方法?
【发布时间】:2020-04-14 04:19:07
【问题描述】:
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。我有这个疑问是因为,显然超类变量可以引用子类对象。 但是,他们将无法访问子类中存在的元素(变量、函数等)。但是上面的代码违反了这个原则。

【问题讨论】:

  • 因为线路:a = b;.
  • 我认为您应该阅读有关多态性和方法覆盖的内容。 display() 存在于 A 中,这就是它知道它存在的原因。 B 覆盖它。
  • 我知道 B 会覆盖它——但是当我分配 a = b; 时,变量 a 不应该只能访问基类中的显示函数——因为它是基类的类型吗? 'a' 不应该知道被覆盖方法的存在。例如:'a' 不知道在子类中声明的变量 n 的存在。如果我尝试按如下方式访问 n :a=b;System.out.println(a.n); 它会给我一个错误。很明显,基类对象不能访问子类的变量——那么它如何访问子类的重写函数呢?
  • 因为它被覆盖了。这就是重写方法的全部意义所在。它告诉对象:“运行没有参数的名为display() 的方法”。如果对象是A 类型,它将运行原始display()。如果它是B 类型,它将使用自己的display() 版本。但是您无法访问父级中未声明的任何内容。

标签: java inheritance overloading derived-class base-class


【解决方案1】:

在执行以下代码时在您的代码中

a = b;

变量 a 指向一个 B 对象。由于 A 是 B 的超类,它可以保存子类实例的引用。 相当于A b = new B(10); 现在如果我们调用 b.display();

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

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

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

【讨论】:

  • @ANIRUDHMS 如果对你有帮助,你能接受答案吗?
猜你喜欢
  • 2017-12-14
  • 1970-01-01
  • 1970-01-01
  • 2020-05-03
  • 1970-01-01
  • 2011-04-05
  • 1970-01-01
  • 2018-06-03
  • 1970-01-01
相关资源
最近更新 更多