[英]constructors in java
public class A {
public A() {
System.out.println("a1");
}
public A(int x) {
System.out.println("a2");
}}
public class B extends A {
public B() {
super(5);
System.out.println("b1");
}
public B(int x) {
this();
System.out.println("b2");
}
public B(int x, int y) {
super(x);
System.out.println("b3");
}}
我不明白为什么当我运行B b= new B();
时不应用A的默认结构B b= new B();
B扩展了A,所以我们首先将A的结构打印为“ a1”,然后将A的第二种结构称为“ a1”,而B()
打印“ b1”,但是当我运行它时,它只打印“ a2,b1”,因此显然A()
开始就不会应用A()
-为什么?
当你说B b = new B();
您正在调用默认的构造函数
public B() {
super(5);
System.out.println("b1");
}
由于已经调用了其超级构造函数[ super(5)
],因此编译器将不会插入隐式默认构造函数。 因此,结果。
注意:从您的问题来看,您似乎具有在创建对象时调用所有构造函数的想法。 恐怕这是不正确的。 只有构造函数将被调用,你显式调用创建对象。 如果该构造函数通过this()
方法调用其他构造函数,则仅将调用其他构造函数。
这是因为您在B构造函数中调用了super(5),后者调用了第二个A构造函数而不是第一个。
B扩展了A,所以首先我们称A的结构为“ a1”
这句话是不正确的。 在B类中,您的无参数构造函数
public B() {
super(5);
System.out.println("b1");
}
调用具有int参数的超类(类A)的构造函数。
public A(int x) {
System.out.println("a2");
}
您永远不会调用super(),因此当您调用B的任何构造函数时,不会调用显示“ a1”的构造函数
调用超级构造函数必须是构造函数的第一行。 如果要调用超类的无参数构造函数(在本例中为打印“ a1”的构造函数),则应编写...
public B() {
super();
System.out.println("b1");
}
如果您未指定调用超级构造函数,那么java会自动调用no参数超级构造函数。
我认为您会误解Java如何处理构造函数。 首先,默认情况下,Java在每个类中仅调用一个构造函数,除非您明确告知它使用this(...)
来调用更多构造函数。 其次,一个被调用的构造是超类的默认构造函数(因此它将调用super()
,而不是this()
); 所以A
类实际上看起来像这样:
public class A {
public A() {
super(); // implicit call to super(), which is Object()
System.out.println("a1");
}
public A(int x) {
super(); // implicit call to super(), which is Object()
System.out.println("a2");
}
}
因此,调用A()
将隐式调用Object()
,但是调用A(int x)
也将隐式调用Object()
,而不是-似乎是假设的A()
。
由于在B中您始终明确指定要调用另一个构造函数,因此编译器将不会添加任何内容。 下面我添加了对super(...)
和this(...)
的调用将发生什么的注释
public class B extends A {
public B() {
super(5); // explicit call to A(5), no implict call to A()
System.out.println("b1");
}
public B(int x) {
this(); // explicit call to B(), no implicit call to A()
System.out.println("b2");
}
public B(int x, int y) {
super(x); // explict call to A(x), no implicit call to A()
System.out.println("b3");
}
}
同样,要记住的重要一点是,除非您使用this(...)
或super(...)
显式调用另一个构造函数,否则Java将在任何构造函数的第一行中插入对super()
的调用。 它永远不会自己插入this()
。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.