Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/401.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_Output - Fatal编程技术网

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.