在Java中,当一个子类继承自父类时,它继承了父类的所有属性和方法(除了私有方法和属性外)。
在创建子类对象时,Java虚拟机会先初始化父类,然后再初始化子类,因为子类的初始化需要依赖于父类的初始化。
父类的初始化是指对父类的静态字段和静态代码块进行初始化。当我们定义一个类时,如果这个类有静态字段或静态代码块,那么这些代码会在类加载时就被执行,无论是否创建了这个类的对象。因此,在创建子类对象时,Java虚拟机必须首先初始化父类,以保证子类对象能够正确地继承和使用父类的属性和方法。
在Java中,要对父类进行初始化,可以在子类中使用super()
语句来调用父类的构造方法。在调用父类的构造方法时,需要注意以下两点:
-
可以显式地调用父类的空构造方法 或 有参构造方法。如果使用有参构造方法,需要传入与父类构造方法所需要的参数相一致的参数列表。
-
如果子类没有显式调用父类的构造方法,那么Java编译器将隐式调用父类的无参构造方法。
需要注意的是,如果父类没有无参构造方法,那么子类必须显式的调用父类的有参构造方法来完成父类的初始化工作,否则编译会出错。
示例:如何在子类中显式调用父类构造方法来完成父类的初始化
public class Parent {
private int age;
private String name;
public Parent(String name, int age) {
this.name = name;
this.age = age;
}
public void speak() {
System.out.println("我是" + name + ",今年" + age + "岁。");
}
}
public class Child extends Parent {
public Child(String name, int age) {
super(name, age); // 显式调用父类构造方法
}
public static void main(String[] args) {
Child child = new Child("小明", 10);
child.speak(); // 输出:我是小明,今年10岁。
}
}
在上述示例中,Child
类继承自Parent
类,通过super(name, age)
语句显式调用了Parent
类有参构造方法,从而完成了父类的初始化工作。这样,在创建Child
类对象时,Child
对象就能够正确地继承和使用Parent
类的属性和方法。