Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/hibernate/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
基类和派生类之间的java构造函数执行过程_Java - Fatal编程技术网

基类和派生类之间的java构造函数执行过程

基类和派生类之间的java构造函数执行过程,java,Java,类库: 派生类: 结果: Derived tell name:null Derived print name:base Derived tell name:Derived Derived print name:Derived 最近有人问我这个问题。我想了想,但没有确切的答案来解释为什么这个程序部分会有这样的执行结果。 希望有人能帮我分析一下这样的问题。非常感谢^-^ 我只想知道构造函数在派生条件下的执行过程。不应该有任何混淆。无论何时调用构造函数,它都将调用父类构造函数。所以,当您构造派生实例

类库:

派生类:

结果:

Derived tell name:null
Derived print name:base
Derived tell name:Derived
Derived print name:Derived
最近有人问我这个问题。我想了想,但没有确切的答案来解释为什么这个程序部分会有这样的执行结果。 希望有人能帮我分析一下这样的问题。非常感谢^-^


我只想知道构造函数在派生条件下的执行过程。

不应该有任何混淆。无论何时调用构造函数,它都将调用父类构造函数。所以,当您构造派生实例时,它将隐式调用基类构造函数。这将在基本实例中将成员变量“name”设置为值“base”。在基本构造函数中调用方法tellName和printName之后,这将实际调用实际实例上的方法。i、 e.派生实例。此时,派生实例中的成员变量“name”为null,这就是为什么会看到派生的tell name:null。之后,当通过在基实例中传递'name'成员变量来调用方法printName时,它只是传递给派生实例中的方法。这就是派生print name:base的原因。一旦父构造函数完成,派生实例中的成员变量“name”被设置为值“Derived”,然后它调用派生实例上的tellName和printNamename。所以,这就是为什么我们看到接下来的两行输出

Derived tell name:Derived
Derived print name:Derived
这是一个很长的故事

在Derived.main中开始执行。这将创建派生的新实例,因此将调用派生构造函数。首先调用基本构造函数,初始化基本子对象的名称,然后调用tellName。由于动态分派,调用的tellName是派生的.tellName,而不是Base.tellName。此打印的文本指的是尚未初始化的派生子对象的名称,而不是已初始化的基础子对象的名称,因此打印派生的tell name:null。控件在基本构造函数中恢复,该构造函数接下来使用基本子对象的名称调用printName。由于动态分派,将调用派生的.printName。它打印的名称是它的参数,正如我们刚才看到的,它是来自基本子对象的名称。因此,它打印派生的打印名:base,因为base子对象的名称以前已初始化为base。基本构造函数现在已完成,并且在派生构造函数中恢复控制。现在,它将派生子对象的名称初始化为“派生”,然后使用观察到的结果以明显的方式调用Derived.tellName和Derived.printName

另外,值得注意的是,这里出现的问题是因为Java在构造函数中动态地分派虚拟调用;其他语言如C++没有,例如参见:


我不明白你的问题。我甚至看不出问题的可能重复。虽然这个问题实际上没有意义,因为你实际上没有问任何问题。但是代码有一个明显的问题,我的车没有修好。这是旧的刹车踏板。非常感谢^-^除了要求提升/接受不是一件好事。实际上,您有可能会被忽略。应该指出的是,您不应该依赖于实例初始化的顺序。有些是在常量表之外执行的,发生得很早,另一些则融合到构造函数中,发生得很晚——这取决于编译器和特定的数据类型。非常感谢你,Keerthi Ramanathan,我只是想知道你写的句子,比如这句话实际上会在实际实例上调用方法。i、 e.派生实例..困扰我的是超类构造函数中的动态分派是如何工作的。派生类的引用是否转移到超类?正在寻找您的答复,谢谢。^-^@HotLicks感谢有关常量表的信息+1.
Derived tell name:null
Derived print name:base
Derived tell name:Derived
Derived print name:Derived
Derived tell name:Derived
Derived print name:Derived