为什么 super() 没有在另一个构造器中被调用?

Why does super() not get called in the other constuctor?

提问人:Arya_ 提问时间:6/11/2022 最后编辑:Federico klez CullocaArya_ 更新时间:6/11/2022 访问量:89

问:

如果两者都被调用,那么为什么“建筑”不打印两次,而是打印一次?House()House(name)

class Building {
    Building() {
        System.out.println("Buiding");
    }
    Building(String name) {
        this();
        System.out.println("Building: String Constructor" + name);
    }
}
class House extends Building {
    House() {
        System.out.println("House ");
    }
    House(String name) {
        this();
        System.out.println("House: String Constructor" + name);
    }
}
public class Test {
    public static void main(String[] args) {
        new House(" OK");
    }
}

输出:

Buiding
House
House: String Constructor OK
java 继承 构造函数 this super

评论

2赞 Mark Rotteveel 6/11/2022
构造函数是链接的,因此调用(using ),它调用(隐式地,如果没有显式调用,编译器会在开始时添加)。这意味着它只打印一次。House(String)House()this()Building()super()Building
0赞 Arya_ 6/11/2022
所以因为我提供了,编译器没有放任何,但是他们都没有放进去,所以编译器放了一个?this()House(String)super()House()
2赞 user207421 6/11/2022
正确。您不希望为同一对象调用两次。super()

答:

2赞 Kristof Neirynck 6/11/2022 #1

House(String name)调用,这与 相同。 隐式调用,这与 相同。this()House()House()super()Building()

你从不打电话.Building(String name)

House(String name)可以打电话来做这件事。super(name)

1赞 Arun Sudhakaran 6/11/2022 #2

下面编译构造函数的基本规则是构造函数的编译形式

  1. 调用当前类构造函数或超类构造函数。如果它不存在,那么编译器将保留此 .this(args if any)super(args if any)super()
  2. 调用实例块。
  3. 在 .java 文件中编写的其余代码

Java 代码

Bean () {
    System.out.println("Inside Bean()");
}

编译后

Bean () {
    super(); // added by compiler
    // call to instance block
    System.out.println("Inside Bean()");
}

因此,一旦你遵循了这条规则,那么你就可以理解,从电话中将要去,因为你给了.从第一次调用开始(因为您没有手动给出调用),它只会调用,同样会再次调用,在这种情况下是 Object 类。House(String name)House()this()House()super()Building()super()