为什么有构造方法?
构造方法是用来初始化的,随着new一起调用(即在对象实例化时被调用),若没有写,系统会自动添加形如(){ }形式的构造函数。
情况1:子类构造方法中无super( )显式调用父类特定构造,则系统默认调用无参数的构造方法(若父类没写无参构造方法,编译器为其生成)
public class TestSuperSub {
public static void main(String arg[]) {
SuperClass sc1 = new SubClass();
}
}
class SuperClass {
private int n;
}
class SubClass extends SuperClass {
private int n;
SubClass() {
System.out.println("SubClass()");
}
}
//输出:SubClass()
public class TestSuperSub {
public static void main(String arg[]) {
SuperClass sc2 = new SubClass(400);
}
}
class SuperClass {
private int n;
}
class SubClass extends SuperClass {
private int n;
SubClass(int n) {
System.out.println("SubClass(" + n + ")");
this.n = n;
}
}
//输出:SubClass(400)
情况2:如果父类中只定义了有参数的构造方法,而在子类的构造方法中又没有通过super()来调用父类中特定的构造方法,则编译出错。
public class TestSuperSub {
public static void main(String arg[]) {
SuperClass sc1 = new SubClass();
}
}
class SuperClass {
private int n;
/*SuperClass() {
//System.out.println("SuperClass()");
}*/
SuperClass(int n) {
System.out.println("SuperClass(" + n + ")");
this.n = n;
}
}
class SubClass extends SuperClass {
private int n;
SubClass() {
//super(); //或者调用无输出内容的父类构造方法 输出:SubClass()
super(300); //必须由super()显式调用
System.out.println("SubClass()");
}
}
/*输出:
SuperClass(300)
SubClass()
*/
public class TestSuperSub {
public static void main(String arg[]) {
// SuperClass sc1 = new SubClass();
SuperClass sc2 = new SubClass(400);
}
}
class SuperClass {
private int n;
SuperClass(int n) {
System.out.println("SuperClass(" + n + ")");
this.n = n;
}
}
class SubClass extends SuperClass {
private int n;
SubClass(int n) {
super(n);
System.out.println("SubClass(" + n + ")");
this.n = n;
}
}
/*输出:
SuperClass(400)
SubClass(400)
*/
注意:如果父类中没有无参的构造方法,且子类构造方法中没有显示调用父类构造方法,编译是不出错的。
技巧:主要看父类中是否有有参的构造方法,若有,则需要子类显式调用。因为系统此时不会默认为其执行无参的构造方法。