class base{ base(){ System.out.println("base constructor"); } base(int i){ System.out.println("base constructor int i"); } } class derived extends base{ derived(){ System.out.println("derived constructor"); } derived(int i){ System.out.println("derived constructor int i"); } public static void main(String[] args){ derived d=new derived(); derived t=new derived(9); } }
D:java hinking hink6>java derived base constructor derived constructor base constructor derived constructor int i
假如将base 类的构造函数注释掉,则出错。
class base{ // base(){ // System.out.println("base constructor"); // } base(int i){ System.out.println("base constructor int i"); } } class derived extends base{ derived(){ System.out.println("derived constructor"); } derived(int i){ System.out.println("derived constructor int i"); } public static void main(String[] args){ derived d=new derived(); derived t=new derived(9); } }
D:java hinking hink6>javac derived.java derived.java:10: cannot resolve symbol symbol : constructor base () location: class base derived(){ ^ derived.java:13: cannot resolve symbol symbol : constructor base () location: class base derived(int i){ ^ 2 errors
说明子类中的构造函数找不到显式写出的父类中的缺省 构造函数,所以出错。
那么假如你不想子类的构造函数调用你显式写出的父类中的缺省 构造函数怎么办呢? 如下例:
class base{ // base(){ // System.out.println("base constructor"); // } base(int i){ System.out.println("base constructor int i"); } } class derived extends base{ derived(){ super(8); System.out.println("derived constructor"); } derived(int i){ super(i); System.out.println("derived constructor int i"); } public static void main(String[] args){ derived d=new derived(); derived t=new derived(9); } }
D:java hinking hink6>java derived base constructor int i derived constructor base constructor int i derived constructor int i