子类对象构造时,首先要构造父类的对象,此时需要调用父类的构造方法。
1、如果父类有默认的构造方法,构造是没有问题的
结果
2、如果父类没有默认构造方法,子类只能在自己的每一个构造方法的第一句调用父类的某一个构造方法来构造父类对象。
输出:
1、如果父类有默认的构造方法,构造是没有问题的
public class D {
private int i;
public D(){}
}
或
public class D {
private int i;
}
public class E extends D {
private int j;
public E(int j) {
System.out.println("class E constructing...");
this.j = j;
}
public static void main(String[] args){
new E(2);
System.out.println("OK!");
}
}
结果
class E constructing...
OK!
2、如果父类没有默认构造方法,子类只能在自己的每一个构造方法的第一句调用父类的某一个构造方法来构造父类对象。
// D.java
public class D {
private int i;
{System.out.println("class D initializing...");}
public D(int i) {
System.out.println("class Di constructing...");
this.i = i;
}
public D(String s){
System.out.println("class Ds constructing...");
}
}
// E.java
public class E extends D {
private int j;
{System.out.println("class E initializing...");}
public E(int j) {
super(j);
System.out.println("class Ei constructing...");
this.j = j;
}
public E(String s){
super(s);
System.out.println("class Es constructing...");
}
//public E(int i, int j){} 这样是不行的,VM不知道该如何构造D的对象
public static void main(String[] args){
new E(2);
System.out.println();
new E("str");
System.out.println("OK!");
}
}
输出:
class D initialization...
class Di constructing...
class E initialization...
class Ei constructing...
class D initialization...
class Ds constructing...
class E initialization...
class Es constructing...
OK!