Java不一致的继承机制?

Tom*_*ngo 3 java oop inheritance

我想我们已经在这篇文章中讨论了这个问题,这里继承Java简单说明

但由于这里的例子有点简单,我想澄清的意思不同,我会试一试.

首先,讨论两个类:

public class SuperClass{
    SuperClass() {
        foo();
    }

    public void foo() {
        System.out.println("Super.foo()");
    }

    public static void main(String[] args) {
            SuperClass tn = new DerivedClass();
            tn.foo();
    }
}

public class DerivedClass extends SuperClass{
    String i;

    TrickyB() {
        i = "aksjhdf";
    }

    public void foo() {
        System.out.println("In derived.foo() --> " + i);
    }
}
Run Code Online (Sandbox Code Playgroud)

我(至少我认为)理解多态的概念,我知道DerivedClass.foo()调用时调用的原因

new DerivedClass();
Run Code Online (Sandbox Code Playgroud)

我在这看到一个不一致的地方:

当我们调用c'tor DerivedClass的c'tor时,SuperClass隐含地称为(所以说作为Derived c'tor的第一行).

所以在Super c'tor中,DerivedClass没有完全初始化,这使得使用这个类没用.这一点反映在该计划的输出中

In derived.foo() --> null
In derived.foo() --> aksjhdf
Run Code Online (Sandbox Code Playgroud)

第一行反映了我的困惑:

为什么DerivedClass.foo()叫?对象还没有准备好,所以用它做任何事情在我眼里都是胡说八道.

任何人都可以向我解释原因.我认为这绝对违反直觉.

顺便说一句:我本来希望SuperClass.foo()被召唤,因为正如我所说的,使用"未准备"的对象没有任何意义.

另一方面:我想起来了.这对我来说没有任何意义,当我在SuperClass的c'tor中时,DerivedClass.foo()被称为!

我怎么称呼SuperClass.foo()我的情况?

Roh*_*ain 7

为什么调用DerivedClass.foo()?对象还没有准备好,所以用它做任何事情在我眼里都是胡说八道.

没有.该对象已经创建.构造函数不创建对象,只是初始化它们.该对象由new运营商在此创建.

我原以为要调用SuperClass.foo()

正如已经解释过的那样,并不是没有创建对象.它已经存在了.并且该调用将调用重写的方法.这就是为什么你永远不应该从构造函数调用重写方法.你会看到意想不到的行为.

SuperClass 对任何派生类都一无所知.

嗯,它不需要知道.方法调用调用派生类方法的事实与超类是否知道子类无关.将在运行时根据图片中的实际对象确定将调用的实际方法.由于此处对象是类型DerivedClass,因此DerivedClass将调用if中的方法.

在我的情况下,我如何调用SuperClass.foo()?

你没有.这就是重点.浏览我链接的帖子,逐步解释.