来自csdn论坛的一个帖子,问题如下:
class A{
public int i=0;
A(int m){
i=1;
}
}
class B extends A{
B(int m){
i=2;
}
}
public class E{
public static void main(String args[]){
B b=new B(100);
System.out.println(b.i);
}
}
我的回答是:
一个类如果没有定义任何构造方法,系统会默认生成一个无参构造方法,
当有定义有参构造方法时,则不会自动生成无参构造方法。
子类继承父类时,若父类有 无参构造方法,则子类构造方法默认隐式调用父类无参构造方法,
当父类没有 无参构造方法,子类的构造方法必须显式调用父类的有参构造方法。
所以代码可以这样改:
class A{
public int i=0;
A(){ //父类添加无参构造
}
A(int m){
i=1;
}
}
class B extends A{
B(int m){
i=2;
}
}
public class E{
public static void main(String args[]){
B b=new B(100);
System.out.println(b.i);
}
}
或
class A{
public int i=0;
A(int m){
i=1;
}
}
class B extends A{
B(int m){
super(m); //子类显式调用父类构造
i=2;
}
}
public class E{
public static void main(String args[]){
B b=new B(100);
System.out.println(b.i);
}
}