类的初始化
程序员文章站
2024-01-01 10:29:04
...
类的初始化过程
-
类加载:当首次创建类对象时(构造器也是静态方法)或者类的静态方法/静态字段首次被访问时,java解释器通过载入class文件,创建class对象,此时,会进行静态初始化,先执行静态字段初始化,再执行静态代码块。静态初始化只会在Class对象首次创建时进行一次。(编译器在加载过程中,发现有超类时,会先对超类进行加载,再依次往下加载,因为子类的static初始化可能会依赖于超类)
-
当创建对象时,首先在堆上分配足够的存储空间,将空间清零,自动将对象中的所有基本类型置为默认值,引用置为null。
-
先执行字段处初始化过程,再执行非静态代码块,最后执行构造器。(同上,如果类是子类,则从根超类依次向下执行初始化过程)
public class Sandwich extends Meal {
private Bread d = new Bread();
public Sandwich() {
System.out.println("sandwich contructor");
}
public static void main(String[] args) {
new Sandwich();
}
}
class Meal {
private Cheese c = new Cheese();
public Meal() {
System.out.println("meal contructor");
}
}
class Bread {
public Bread() {
System.out.println("Bread contructor");
}
}
class Cheese extends Bread {
public Cheese() {
System.out.println("Cheese contructor");
}
}
Bread contructor
Cheese contructor
meal contructor
Bread contructor
sandwich contructor
构造器
在父类的构造器中如果调用一个多态方法时,由于这个多态方法被子类覆写,但是此时子类还未初始化完全,该方法可能会操作子类中还未初始化完全的成员,可能会出现错误。在构造器中唯一能安全调用的方法是父类中的final,private方法,这些方法不能被覆写。