执行顺序
1、 父类的静态代码块 父类的静态属性成员(java虚拟机加载类时就会执行该代码,并且只执行一次),两者的执行顺序取决于他们在程序中出现的顺序
2、 子类的静态代码块 子类的静态属性成员(java虚拟机加载类时就会执行该代码,并且只执行一次),两者的执行顺序取决于他们在程序中出现的顺序
3、 父类的普通属性默认初始化(普通成员变量),就是在类定义时就赋值的语句
4、 父类的普通代码块(每次new,每次执行)
5、 父类的构造函数(每次new,每次执行)
6、 子类的普通属性默认初始化(普通成员变量)就是在类定义时就赋值的语句
7、 子类的普通代码块(每次new,每次执行)
8、 子类的构造函数(每次new,每次执行)
注意:java中成员属性在显式初始化之前会进行自动初始化,这是不同于c、c++的
特例:当前类的成员变量就是当前类的对象
如果成员变量在定义时就new对象,那么当前成员必须为静态变量,否则会运行时报错,并且此时new就直接调用了构造函数,不用等类加载完成
public class Store { static Store s1 = new Store(); static Store s2 = new Store(); Store(){ System.out.println("执行构造器方法"); } static{ System.out.println("执行静态代码块"); } public static void main(String[] args) { Store store = new Store(); } } 输出:执行构造器方法 执行构造器方法 执行静态代码块 执行构造器方法
如果成员变量在定义时只是声明,那么当前成员不必为静态变量,当对它进行赋值时类已经加载完成
public class Store { Store s1 ; Store s2 ; Store(){ System.out.println("执行构造器方法"); } static{ System.out.println("执行静态代码块"); } public static void main(String[] args) { Store store = new Store(); } } 输出:执行静态代码块 执行构造器方法