Java 类的初始化和实例的初始化
类的初始化
一个子类初始化要先初始化他的父类
一个类初始化就是执行clinit方法
- 这里我们注意 这里的初始化是对静态变量和静态代码块进行初始化 而他们两执行的先后顺序就是看谁写在前面 谁写在后面
实例的初始化
实例的初始化就是执行init方法
- init方法由3部分组成 分别是 非静态的实例变量 非静态代码块 对应构造器代码组成
- 非静态实例变量的赋值和非静态代码块从上到下按顺序执行 对应的构造器代码最后执行
- init方法首先执行父类的init方法
总结
- 触发初始化的执行顺序
1)父类的静态成员变量和static代码块
2)子类的静态成员变量和static代码块
3)父类的普通成员变量和非static代码块
4)父类的构造方法
5)子类的普通成员变量和非static代码块
6)子类的构造方法
我们来看一个例子
package com.zyk;
class HelloA {
private static int i=method();
public static int method(){
System.out.println("父类的静态变量");
return 1;
}
public HelloA() {
System.out.println("HelloA");
}
{ System.out.println("I'm A class"); }
static { System.out.println("父类的静态代码块 static A"); }
}
public class HelloB extends HelloA {
private static int i=method();
public static int method(){
System.out.println("子类的静态变量");
return 1;
}
public HelloB() {
System.out.println("HelloB");
}
{ System.out.println("I'm B class"); }
static { System.out.println("子类的静态代码块 static B"); }
public static void main(String[] args) {
new HelloB();
}
}
运行结果
父类的静态变量
父类的静态代码块 static A
子类的静态变量
子类的静态代码块 static B
I'm A class
HelloA
I'm B class
HelloB