Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/340.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
Java3中的奇怪输出_Java - Fatal编程技术网

Java3中的奇怪输出

Java3中的奇怪输出,java,Java,这个java程序输出12和“Test”。但是,我不明白为什么12号已经印出来了 // Filename: MyClass.java public class MyClass { public static void main(String[] args) { B b = new B("Test"); } } class A { A() { this("1", "2"); } A(String s, String t) { this(s + t);

这个java程序输出12和“Test”。但是,我不明白为什么12号已经印出来了

 // Filename: MyClass.java
public class MyClass {
    public static void main(String[] args) {
        B b = new B("Test");
    }
}
class A {
    A() { this("1", "2"); }
    A(String s, String t) { this(s + t); }
    A(String s) { System.out.println(s); }
}
class B extends A {
    B(String s) { System.out.println(s); }
    B(String s, String t) { this(t + s + "3"); }
    B() { super("4"); };
}

每当调用扩展类的构造函数时,如果您自己不调用
super()
(或使用参数调用
super(someParameter)
),编译器会在执行任何其他操作之前自动调用
super()

所以

变成

class B extends A {
    B(String s) { 
        super();
        System.out.println(s);
    }
}
这种情况经常发生。在您的例子中,将调用构造函数
A(){this(“1”,“2”);}
,它现在调用
A(String s,String t){this(s+t);}
,最后调用
A(String s){System.out.println(s);}


记住这一点,应该清楚的是,
A(){this(“1”,“2”);}
负责打印
12

嘿,没有什么问题,存在对超级构造函数的隐式调用。
当类B在创建类B实例时扩展类A时,它也会调用类A的构造函数——在您的例子中,它是类A的默认构造函数,再次调用类构造函数“A(字符串s,字符串t)”,然后再次调用“A(字符串s)”。因此,它将输出设为12并进行测试。哪个是正确的。

Java3??哇!无论如何格式化您的代码。除非指定了不同的构造函数,否则将始终调用超类的默认构造函数。@matt-这是。。。奇怪的我不知道Java会自动为您调用super,如果您自己不调用它的话。似乎是一种行为,使得编写编译器,再加上像人一样阅读代码变得更加困难。除了糟糕的格式之外,这个问题没有什么错。这不值得这些否决票。@redFIVE基本上一切都有很好的记录。不理解代码的错误是人们询问StackOverflow问题的主要原因之一。问题不是“构造函数如何在继承类中工作?”。问题是“我得到的输出与预期完全不同,我不知道为什么。怎么了?”这是完全正确的。如果为B添加默认构造函数,新B(s)将调用super()??@Billydan是的,添加默认构造函数在调用
新B(s)
时不会改变任何内容。当被
new B()
@Billydan调用时,即使默认构造函数也会调用
super()
,只有在调用了
dinner()
的情况下才会调用。非常感谢。在我看来,仅仅一个类有更多的构造函数是很奇怪的,我认为这(“1”,“2”)是有问题的(没有任何字符串或int…),但在调试中它没有显示任何错误。另外,我知道B类保留了A类属性,但由于调用了主类,我认为它必须只执行B类指令。再次感谢。
class B extends A {
    B(String s) { 
        super();
        System.out.println(s);
    }
}