当子类继承了父类,子类的构造函数需要注意以下三个方面:
- 子类构造函数默认调用父类无参构造函数示例代码
class Parent { public Parent() { System.out.println("父类的无参构造函数"); } } class Child extends Parent { public Child() { // super(); // 显式调用父类构造函数 System.out.println("子类的构造函数"); } } class Main { public static void main(String[] args) { Child child = new Child(); } }
输出结果:
父类的无参构造函数 子类的构造函数
注意看即使没有显式调用,编译器会默认在子类构造函数的开头加上这行代码来调用父类的无参构造函数。
-
子类构造函数不会被继承示例代码
class Parent { public Parent() { System.out.println("父类的构造函数"); } } class Child extends Parent { } public class Main { public static void main(String[] args) { Child child = new Child(); } }
输出结果:
父类的构造函数
构造函数既然不能像普通函数那样能够被继承,又会默认在子类构造函数的开头加上这行代码来调用父类的无参构造函数。那么怎么让输出结果只出现子类的构造函数这句话呢?以下是解决方法
class Parent { public int age; public Parent() { if (!(this instanceof Child)) { System.out.println("父类的无参构造函数"); } } } class Child extends Parent { public Child() { // super(); // 显式调用父类构造函数 System.out.println("子类的构造函数"); } } class Main { public static void main(String[] args) { Child child = new Child(); } }
在这个示例代码中,我们修改了父类构造函数中的条件判断。使用instanceof运算符判断当前对象是否为Child类的实例,如果不是,则打印父类的无参构造函数的输出。
-
子类的带参构造函数也会自动调用父类的无参构造函数
class Child2 extends Parent2 { public Child2() { super(); // 调用父类构造函数 System.out.println("子类的构造函数"); } public Child2(String message) { System.out.println("子类的带参构造函数:" + message ); } } class Main2 { public static void main(String[] args) { Child2 child1 = new Child2(); Child2 child2 = new Child2("调用子类构造函数"); } }
输出结果:
父类的构造函数 子类的构造函数 父类的构造函数 子类的带参构造函数:调用子类构造函数