Java 输出说明
我的节目Java 输出说明,java,output,Java,Output,我的节目 class Building { Building() { System.out.print("b "); } Building(String name) { this(); System.out.print("bn " + name); } }; public class House extends Building { House() { System.out.print("h "); // this is line# 1 } House(St
class Building {
Building() {
System.out.print("b ");
}
Building(String name) {
this();
System.out.print("bn " + name);
}
};
public class House extends Building {
House() {
System.out.print("h "); // this is line# 1
}
House(String name) {
this(); // This is line#2
System.out.print("hn " + name);
}
public static void main(String[] args) {
new House("x ");
}
}
我们知道编译器将编写对super的调用,作为子类构造函数的第一行。因此,输出不应该是:
b编译器对super的书面调用,在第2行之前
b在第1行之前,再次从编译器编写对super的调用
h hn x
但结果是
b h hn x
为什么呢 当一个构造函数开始调用另一个构造函数this或super时,编译器不会插入对超类默认构造函数的调用。因此,调用树是:
main
\-> House(String) (explicit call)
|-> House() (explicit call)
| |-> Building() (implicit call)
| | |-> Object() (implicit call)
| | \-> print "b "
| \-> print "h "
\-> print "hn x"
当一个构造函数以调用另一个构造函数(this或super)开始时,编译器不会插入对该超类的默认构造函数的调用。因此,调用树是:
main
\-> House(String) (explicit call)
|-> House() (explicit call)
| |-> Building() (implicit call)
| | |-> Object() (implicit call)
| | \-> print "b "
| \-> print "h "
\-> print "hn x"
您的Housestring名称构造函数调用House,House反过来调用Building。从未调用Buildingstring名称
如果您想显式调用Buildingstring名称,可以在Housestring名称构造函数中添加以下内容:supername;而不是这个, 您的Housestring名称构造函数调用House,House反过来调用Building。从未调用Buildingstring名称
如果您想显式调用Buildingstring名称,可以在Housestring名称构造函数中添加以下内容:supername;而不是这个, 根据
如果构造函数主体不是以显式构造函数开头
调用和声明的构造函数不是
原始类对象,则构造函数体隐式开始
使用超类构造函数调用super
依照
如果构造函数主体不是以显式构造函数开头
调用和声明的构造函数不是
原始类对象,则构造函数体隐式开始
使用超类构造函数调用super
以下是代码的视觉控制流程:
new House("x ")---> House(args)---> House() --->Building()--->Object()
^^this() ^implicit ^implicit super() call
super()
call
-->代表调用
输出:B来自无args大楼,H来自无args大楼,hn x来自args大楼
bhhnx
据我所知,对super的隐式调用应该在这之前, 正当第2行,在我的代码中 编辑:
构造函数中的第一行要么是使用super调用超类构造函数,要么是使用super调用重载构造函数。如果使用此函数调用重载构造函数,则不会调用super。以下是代码的视觉控制流:
new House("x ")---> House(args)---> House() --->Building()--->Object()
^^this() ^implicit ^implicit super() call
super()
call
House(x) -> House() + "hn" + "x"
Building() + "h" + "hn" +"x"
"b" + "h" + "hn" + "x"
-->代表调用
输出:B来自无args大楼,H来自无args大楼,hn x来自args大楼
bhhnx
据我所知,对super的隐式调用应该在这之前, 正当第2行,在我的代码中 编辑: 构造函数中的第一行要么是使用super调用超类构造函数,要么是使用super调用重载构造函数。如果使用此函数调用重载构造函数,则不会调用super
House(x) -> House() + "hn" + "x"
Building() + "h" + "hn" +"x"
"b" + "h" + "hn" + "x"
对超类的调用将只调用一次
如果希望调用Buildingstring名称,则必须显式调用它
我想用super代替这个会更容易
对超类的调用将只调用一次
如果希望调用Buildingstring名称,则必须显式调用它
我认为你可以更容易地使用super而不是这个Housex->this House->Building它也没有多大意义,如果超级构造函数被调用了不止一次,这可能也违反了Java的构造函数合同。Housex->this House->Building它也没有多大意义,如果超级构造函数被调用了不止一次——这可能也违反了Java的构造函数契约。谢谢。有什么地方可以让我读到更多关于这方面的信息吗?说标准还是什么?想知道这背后的原因吗?@Anon-这一切都在中详细说明了。为大量致密材料做好准备。一个更温和的介绍与一些细节缺失可在。谢谢。最后一个问题的提出仅仅是因为一些评论员对我的理解产生了疑问,即对“超级”的默示呼叫在第1行或第2行之前?@Anon-对“超级”的默示呼叫在第1行之前。如果构造函数以调用任何类型的另一个构造函数(this或super)开始,则编译器从不插入超类构造函数调用。另外,如果构造函数x要调用构造函数y,那么对y的调用必须是x主体中的第一条语句。有什么地方可以让我读到更多关于这方面的信息吗?说标准还是什么?想知道这背后的原因吗?@Anon-这一切都在中详细说明了。为大量致密材料做好准备。一个更温和的介绍与一些细节缺失可在。谢谢。最后一个问题的提出仅仅是因为一些评论员对我的理解产生了疑问,即对“超级”的默示呼叫在第1行或第2行之前?@Anon-对“超级”的默示呼叫在第1行之前。编译器从不
如果构造函数以调用其他任何类型的构造函数(this或super)开始,则插入超类构造函数调用。另外,如果构造函数x要调用构造函数y,那么对y的调用必须是x主体中的第一条语句。是的,我知道构建字符串名永远不会被调用,我甚至从来没有提到过会这样。我的问题有些不同。很抱歉,我错过了您放置的位置//这是第1行,只是使用您的代码作为参考。是的,我知道构建字符串的名称永远不会被调用,我甚至从未提到过它会是这样。我的问题有些不同。很抱歉,我错过了您放置的位置//这是第1行,只是使用您的代码作为参考。谢谢,但我的问题实际上是,为什么只调用superonce@Anon:因为在第2行有显式构造函数调用,如果没有显式构造函数调用,则只会发生隐式调用super。请再读一遍文本JLS。谢谢,但我的问题实际上是,为什么只叫superonce@Anon:因为在第2行有显式构造函数调用,如果没有显式构造函数调用,则只会发生隐式调用super。请再读一遍课文JLS。我想我现在明白了。我还有一个问题-为什么只给super打了一次电话?我想我现在明白了。我还有一个问题——为什么对超级的调用只有一次?据我所知,对超级的隐式调用应该在这之前,对吗?第二行,在我的code@Anon不,如果显式调用重载的cons,则该构造函数中不会有超级调用,请检查我的编辑。谢谢。我学到了一些新东西+1.据我所知,对super的隐式调用应该在这之前,对吗?第二行,在我的code@Anon不,如果显式调用重载的cons,则该构造函数中不会有超级调用,请检查我的编辑。谢谢。我学到了一些新东西+1.