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()
我的情况?
为什么调用DerivedClass.foo()?对象还没有准备好,所以用它做任何事情在我眼里都是胡说八道.
没有.该对象已经创建.构造函数不创建对象,只是初始化它们.该对象由new
运营商在此创建.
我原以为要调用SuperClass.foo()
正如已经解释过的那样,并不是没有创建对象.它已经存在了.并且该调用将调用重写的方法.这就是为什么你永远不应该从构造函数调用重写方法.你会看到意想不到的行为.
SuperClass
对任何派生类都一无所知.
嗯,它不需要知道.方法调用调用派生类方法的事实与超类是否知道子类无关.将在运行时根据图片中的实际对象确定将调用的实际方法.由于此处对象是类型DerivedClass
,因此DerivedClass
将调用if中的方法.
在我的情况下,我如何调用SuperClass.foo()?
你没有.这就是重点.浏览我链接的帖子,逐步解释.
归档时间: |
|
查看次数: |
112 次 |
最近记录: |