Java继承问题 - 尝试理解这个概念

use*_*206 2 java inheritance

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

我有两个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();
    }
}
Run Code Online (Sandbox Code Playgroud)

主要:

A ab = new B();
((B) ab).superYosef();
Run Code Online (Sandbox Code Playgroud)

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

Mar*_*nik 5

调用实例方法时this,唯一重要的是调用它的对象的类型.此类型仅在运行时才知道.

调用实例方法时super,动态分派不适用.在编译时选择该方法.

在你的代码中:

  1. 你创建一个new B();并打电话B.superYosef();
  2. 呼叫super.yosef();出现在该方法调用A.yosef() 静态(不经受动态调度);
  3. A.yosef()调用this.arik()- 如上所述,一个被调用的方法this受动态调度的影响;
  4. 的类型this就是B,因此该方法B.yosef()被调用.


Jes*_*per 5

当你这样做

A ab = new B();
Run Code Online (Sandbox Code Playgroud)

然后ab是类型的变量A,但它引用的实际对象是类型B.对象的实际类型确定将调用哪个方法,而不是变量的类型.

因此,当您调用ab已在类中重写的任何方法时,将调用类B中的版本B.

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

((B) ab).superYosef();
Run Code Online (Sandbox Code Playgroud)

你需要强制转换,因为该方法superYosef只在类中定义B.

该方法调用super.yosef();,它将yosef在类中调用该方法A.的A.yosef通话arik,而且这种方法在课堂上被覆盖B.请注意,我们已经在一个实际为a的对象上调用了该方法B,因此调用了arik方法in B,进行打印Arik_B.