ama*_*ice 34 java constructor object superclass
考虑以下代码:
class Test {
Test() {
System.out.println("In constructor of Superclass");
}
int adds(int n1, int n2) {
return(n1+n2);
}
void print(int sum) {
System.out.println("the sums are " + sum);
}
}
class Test1 extends Test {
Test1(int n1, int n2) {
System.out.println("In constructor of Subclass");
int sum = this.adds(n1,n2);
this.print(sum);
}
public static void main(String[] args) {
Test1 a=new Test1(13,12);
Test c=new Test1(15,14);
}
}
Run Code Online (Sandbox Code Playgroud)
如果我们在超类中有一个构造函数,它将由我们为子类构造的每个对象调用(例如a
,类Test1
调用的对象Test1(int n1, int n2)
以及它的父类Test()
).
为什么会这样?
该程序的输出是:
在Superclass的构造函数中
在Subclass的构造函数中
总和是25
在Superclass的构造函数中
在Subclass的构造函数中
总和是29
Hei*_*bug 20
是.必须在构造派生类之前构造超类,否则可能无法初始化派生类中应该可用的某些字段.
一点注意事项:如果必须显式调用超类构造函数并传递一些参数:
baseClassConstructor(){
super(someParams);
}
Run Code Online (Sandbox Code Playgroud)
那么超级构造函数必须是第一个调用派生构造函数的方法.例如,这将无法编译:
baseClassConstructor(){
foo();
super(someParams); // compilation error
}
Run Code Online (Sandbox Code Playgroud)
每个类构造函数都会通过编译器自动添加super().
我们都知道默认构造函数是由编译器自动提供的,但它也为第一个语句添加了super().如果你正在创建自己的构造函数,并且你没有this()或super()作为第一个语句,编译器将提供super()作为构造函数的第一个语句.
归档时间: |
|
查看次数: |
50060 次 |
最近记录: |