我试图理解继承的概念,我有一个小问题。

我有两个班级A和B作为:

public class B extends A
{
    public B()
    {
        System.out.println ("B");
    }

    public void arik ()
    {
        System.out.println("Arik_B");
    }
    public void yosef ()
    {
        System.out.println ("Yosef");
    }

    public void superYosef()
    {
        super.yosef();
    }
}

public class A
{
    public A()
    {
        System.out.println ("A");
    }

    public void arik ()
    {
        System.out.println ("Arik_A");
    }

    public void yosef ()
    {
        arik();
    }
}


主要:

A ab = new B();
((B) ab).superYosef();


A ab = new B();行将打印A B,这很清楚。
但是行((B) ab).superYosef();打印Arik_B,我不明白为什么。
在运行ab之前输入A并在运行时输入B,因此需要打印Yosef

最佳答案

当你做

A ab = new B();


那么变量ab的类型为A,但是它引用的实际对象的类型为B。对象的实际类型决定了将调用哪个方法,而不是变量的类型。

因此,当您在ab上调用在类B中已被覆盖的任何方法时,将调用类B中的版本。

让我们看看这里发生了什么:

((B) ab).superYosef();


您需要强制转换,因为方法superYosef仅在类B中定义。

该方法调用super.yosef();,它将在类yosef中调用A方法。 A.yosef调用arik,并且此方法在类B中被覆盖。请注意,我们已经在实际上是B的对象上调用了该方法,因此将调用arik中的B方法,该方法将显示Arik_B

09-06 02:23