Java类实例化运行顺序
本次主要是运用代码观察:
- Java类中静态资源-内部成员-非静态资源-构造器运行顺序;
- 以及父-子类实例化时运行顺序;
- static资源的特性。
Father类(本身实例化运行顺序)
package javaBase.runMechanism;
/**
* @author lzk
* @Package javaBase.runMechanism
* @date 2022/8/27 17:49
*/
public class Father {
static {
System.out.println("Father执行静态代码块");
}
protected static Member staticMember = new Member("Father-静态变量");;
protected Member member = new Member("Father");
{
System.out.println("Father执行非静态代码块");
}
protected Member member1 = new Member("Father-1");
public Father(){
System.out.println("Father正在创建");
}
public static void main(String[] args) {
Father father = new Father();
}
}
Member类
package javaBase.runMechanism;
/**
* @author lzk
* @Package javaBase.runMechanism
* @date 2022/8/27 17:52
*/
public class Member {
public Member(String name){
System.out.println(name+"的Member正在创建");
}
}
运行main方法:
由此看出实例化的顺序:静态代码块->静态成员变量->成员变量/非静态代码块(两者按执行顺序遵从从上往下)->构造器
Son类(父-子实例化运行顺序)
package javaBase.runMechanism;
/**
* @author lzk
* @Package javaBase.runMechanism
* @date 2022/8/27 17:55
*/
public class Son extends Father {
static {
System.out.println("Son执行静态代码块");
}
protected static Member staticMember = new Member("Son-静态变量");;
protected Member member = new Member("Son");
{
System.out.println("Son执行非静态代码块");
}
protected Member member1 = new Member("Son-1");
public Son(){
System.out.println("Son正在创建");
}
public static void main(String[] args) {
Father son = new Son();
}
}
运行main方法:
由此看出实例化的顺序:
父类
静态代码块->父类
静态成员变量->子类
静态代码块->子类
静态成员变量->父类
成员变量/非静态代码块(两者按执行顺序遵从从上往下)->父类
构造器->子类
成员变量/非静态代码块->子类
构造器
testMain(观察类的静态资源)
执行testMain:
package javaBase.runMechanism;
/**
* @author lzk
* @Package javaBase.runMechanism
* @date 2022/8/27 18:00
*/
public class TestMain {
public static void main(String[] args) {
Father father = new Father();
System.out.println("--------------");
Father son = new Son();
System.out.println("--------------");
Father son1 = new Son();
}
}
运行结果:
由此可知:每个类的
静态代码块或是静态成员变量
在实例化的时候最先执行,并且当再次实例化此类时,静态代码块或是静态成员变量
不会重新执行。所以,多线程时静态资源
的锁会是此类,而不是此类实例化后的对象。