Java 构造对象实例时创建的输出是什么

Java 构造对象实例时创建的输出是什么,java,Java,假设以下代码运行时没有错误: 假设在另一个类中有一个main方法:a var1=newc 有两个问题我回答错了: 1通过构造该C实例将创建什么输出 我对这个问题的回答是一些,我认为它是这样的,因为它说的是新的C;,因此它创建了一个新的C对象,并在该类的构造函数中打印了一些。但我错了,正确的答案是这里的一个。这对我来说毫无意义,我真的不知道这是怎么可能的 2如果使用方法调用B var1.report,则调用哪个方法 我的答案是B班的方法报告。我认为这是正确的答案,因为var1是用B铸造的,所以我假

假设以下代码运行时没有错误:

假设在另一个类中有一个main方法:a var1=newc

有两个问题我回答错了:

1通过构造该C实例将创建什么输出

我对这个问题的回答是一些,我认为它是这样的,因为它说的是新的C;,因此它创建了一个新的C对象,并在该类的构造函数中打印了一些。但我错了,正确的答案是这里的一个。这对我来说毫无意义,我真的不知道这是怎么可能的

2如果使用方法调用B var1.report,则调用哪个方法

我的答案是B班的方法报告。我认为这是正确的答案,因为var1是用B铸造的,所以我假设它将使用B类中的方法。但我也错了。正确答案是C班的方法。这对我来说也没有意义

这是非常令人困惑的,我真的不知道如何得到这些答案。如果有人能向我解释到底发生了什么以及他们是如何得到这个答案的,我将不胜感激。

答案1。调用C的构造函数在一定程度上是正确的,但不要忘记子对象总是调用其父对象上的构造函数。如果子类没有指定调用哪个构造函数,那么将使用no-args构造函数

因此,在C的构造函数中,编译器添加了一个对super的调用,它调用了B上的构造函数,编译器再次添加了对super的调用,它调用了a上的构造函数。因此,整个链最终变成了a->B->C

答复2。即使arg1被强制转换为B,它仍然是C的实例。因此多态性将导致调用C上的report方法

如果您将A重命名为动物,将B重命名为哺乳动物,将C重命名为狗,这可能更容易可视化。所以你可以把狗的例子称为动物或哺乳动物,这是正确的,但这并不能改变它仍然是狗的事实。希望有帮助。

回答1。调用C的构造函数在一定程度上是正确的,但不要忘记子对象总是调用其父对象上的构造函数。如果子类没有指定调用哪个构造函数,那么将使用no-args构造函数

因此,在C的构造函数中,编译器添加了一个对super的调用,它调用了B上的构造函数,编译器再次添加了对super的调用,它调用了a上的构造函数。因此,整个链最终变成了a->B->C

答复2。即使arg1被强制转换为B,它仍然是C的实例。因此多态性将导致调用C上的report方法


如果您将A重命名为动物,将B重命名为哺乳动物,将C重命名为狗,这可能更容易可视化。所以你可以把狗的例子称为动物或哺乳动物,这是正确的,但这并不能改变它仍然是狗的事实。希望这会有所帮助。

每个构造函数ctor所做的第一件事,不管它是否显式编写,都是调用一个超类ctor。如果它没有显式指定,则调用没有参数的超类ctor。所以C的ctor调用B的ctor,B的ctor调用A的ctor,B的ctor调用对象的ctor,A的超类,即使A没有显式声明为扩展对象。对象ctor不打印任何内容。它返回到A,它打印一个,返回到B,它在这里打印,返回到C,它打印一些

one
here
some
在要求报告的情况下,B的演员阵容无关紧要。Java中的方法根据对象的实际运行时类型进行调度,在本例中,var1对象的类型为C。因此,当调用该方法时,JVM将查看实际对象并找到C.report方法。这就是被派遣的人

对象的编译时类型是B,如果必须在编译时决定调用哪个方法,它将选择一个.report,因为该report方法在B中没有被重写,但该方法是在运行时找到的,而对象的实际类型是已知的


重载方法的哪个重载在编译时决定调用两个名称相同但参数不同的方法,但在运行时选择被重写的方法。也有一些语言在运行时决定重载,但Java不是其中之一。

每个构造函数构造函数的第一件事,不管它是否显式编写,都是调用一个超类,如果它没有显式指定,则调用一个没有参数的超类。所以C的ctor调用B的ctor,B的ctor调用A的ctor,B的ctor调用对象的ctor,A的超类,即使A没有显式声明为扩展对象。对象ctor不打印任何内容。它返回到A,它打印一个,返回到B,它在这里打印,返回到C,它打印一些

one
here
some
就 报告的要求,B的演员阵容无关紧要。Java中的方法根据对象的实际运行时类型进行调度,在本例中,var1对象的类型为C。因此,当调用该方法时,JVM将查看实际对象并找到C.report方法。这就是被派遣的人

对象的编译时类型是B,如果必须在编译时决定调用哪个方法,它将选择一个.report,因为该report方法在B中没有被重写,但该方法是在运行时找到的,而对象的实际类型是已知的


重载方法的哪个重载在编译时决定调用两个名称相同但参数不同的方法,但在运行时选择被重写的方法。也有一些语言在运行时决定重载,但Java不是其中之一。

他们从以下部分得到了答案:

如果构造函数主体不是以显式构造函数开头 调用和声明的构造函数不是 原始类对象,则构造函数体隐式开始 使用超类构造函数调用super;,援引 不带参数的直接超类的构造函数

和第节:

在这里,类SlowPoint用自己的move方法覆盖类Point的方法move的声明,这限制了距离 该点可以在每次调用该方法时移动。当 move方法是为类SlowPoint的实例调用的 将始终调用类SlowPoint中的重写定义,即使 如果对SlowPoint对象的引用取自变量 他的类型是Point


他们从以下章节中得到了答案:

如果构造函数主体不是以显式构造函数开头 调用和声明的构造函数不是 原始类对象,则构造函数体隐式开始 使用超类构造函数调用super;,援引 不带参数的直接超类的构造函数

和第节:

在这里,类SlowPoint用自己的move方法覆盖类Point的方法move的声明,这限制了距离 该点可以在每次调用该方法时移动。当 move方法是为类SlowPoint的实例调用的 将始终调用类SlowPoint中的重写定义,即使 如果对SlowPoint对象的引用取自变量 他的类型是Point


下面是一篇关于构造函数链的教程下面是一篇关于构造函数链的教程感谢hooda现在变得更有意义:感谢hooda现在变得更有意义: