java父类和子类中构造函数的调用问题实例讲解。
1.如果父类中没有构造函数,即使用默认的构造函数,那子类的构造函数会自动调用父类的构造函数
- class
Father { -
private int a, b; -
-
void show() { -
System.out.println(a); -
} - }
-
- class
Son extends Father { -
private int c, d; -
-
Son(int c, int d) { -
this.c = c; -
this.d = d; -
} - }
-
- public
class ConstructionTest { -
public static void main(String args[]) { -
Son s = new Son(2, 3); -
s.show(); -
} - }
输出结果0,说明子类的构造函数自动调用父类的无参构造函数,初始化父类的成员为0
2.如果父类中定义了无参构造函数,子类的构造函数会自动调用父类的构造函数
- class
Father { -
private int a, b; -
-
Father() { -
System.out.println(“father done”); -
} -
-
void show() { -
System.out.println(a); -
} - }
-
- class
Son extends Father { -
private int c, d; -
-
Son(int c, int d) { -
this.c = c; -
this.d = d; -
} - }
-
- public
class ConstructionTest { -
public static void main(String args[]) { -
Son s = new Son(2, 3); -
s.show(); -
} - }
输出结果:father done
0
说明重写了默认的无参构造函数,子类自动调用这个函数,父类的成员还是被初始化为0.
3. 如果定义了有参构造函数,则不会有默认无参构造函数,这样的话子类在调用父类的午餐构造函数的时候会出错(没有用super调用父类有参构造函数的情况下)
- class
Father { -
private int a, b; -
-
Father(int a, int b) { -
this.a = a; -
this.b = b; -
} -
-
void show() { -
System.out.println(a); -
} - }
-
- class
Son extends Father { -
private int c, d; -
-
Son(int c, int d) { -
this.c = c; -
this.d = d; -
} - }
-
- public
class ConstructionTest { -
public static void main(String args[]) { -
Son s = new Son(2, 3); -
s.show(); -
} - }
输出结果:
Exception in thread “main” java.lang.NoSuchMethodError: Father: method <init>()V
not found
at Son. <init>(Son.java:5)
at ConstructionTest.main(ConstructionTest.java:6)
总结:
1 任何类,都会调用父类的构造器
2 如果没写,则调用父类无参数的
3 否则必须手工写上调用哪个,且必须是第一行
本文链接地址: java父类和子类中构造函数的调用问题实例讲解