Java 构造函数调用的特殊性是什么?
在 Java 中,构造函数的调用有一些特殊性,需要理解这些特殊性才能正确地编写和使用构造函数。
构造函数链式调用
当一个子类构造函数被调用时,它会自动调用其超类的构造函数。这种行为被称为构造函数链式调用。子类构造函数中的第一行代码将始终是显式或隐式调用超类构造函数的语句。
class Parent { Parent() { System.out.println("Parent constructor called"); } } class Child extends Parent { Child() { System.out.println("Child constructor called"); } } public class Main { public static void main(String[] args) { Child child = new Child(); // 输出: // Parent constructor called // Child constructor called } }
显式构造函数调用
有时需要显式地调用超类的构造函数,可以使用 super 关键字。
class Parent { Parent(int value) { System.out.println("Parent constructor with value " + value + " called"); } } class Child extends Parent { Child() { super(10); System.out.println("Child constructor called"); } } public class Main { public static void main(String[] args) { Child child = new Child(); // 输出: // Parent constructor with value 10 called // Child constructor called } }
无默认构造函数
如果父类没有定义无参构造函数,则子类也不能定义无参构造函数。子类必须显式地调用超类的有参构造函数。
实战案例
以下是显示构造函数链式调用的实战案例:
class Shape { protected String color; Shape(String color) { this.color = color; } } class Circle extends Shape { private double radius; Circle(double radius, String color) { super(color); this.radius = radius; } } public class Main { public static void main(String[] args) { Circle circle = new Circle(5.0, "Red"); System.out.println("Circle color: " + circle.color); System.out.println("Circle radius: " + circle.radius); // 输出: // Circle color: Red // Circle radius: 5.0 } }
该代码演示了父子类之间的构造函数链式调用,通过子类构造函数可以访问和初始化父类属性。