一 、某个类
1 静态变量、静态代码块(顺序与代码顺序一致)
2 非静态变量、构造代码块(顺序与代码顺序一致)
3 构造方法
二 、继承 +启动类(main 方法所在类)
package echartsTest.ExrSort;
public class ClassA {
public static int staticMember = staticMethod();
static {
System.out.println("ClassA的 静态代码块");
}
{
System.out.println("ClassA的 构造代码块");
}
public int memberVar = memberMethod();
public ClassA() {
System.out.println("ClassA的 构造方法");
}
private static int staticMethod() {
System.out.println("ClassA的 静态变量");
return 0;
}
private int memberMethod() {
System.out.println("ClassA的 非静态变量");
return 0;
}
}
package echartsTest.ExrSort;
public class ClassB extends ClassA {
static {
System.out.println("ClassB的 静态代码块");
}
public ClassB() {
System.out.println("ClassB的 构造方法");
}
public int classc02 = memberMethod();
{
System.out.println("ClassB的 构造代码块");
}
public static int staticMember = staticMethod();
public void excute() {
System.out.println("执行方法");
}
private static int staticMethod() {
System.out.println("ClassB的 静态变量");
return 0;
}
private int memberMethod() {
System.out.println("ClassB的 非静态变量");
return 0;
}
}
package echartsTest.ExrSort;
public class Test {
public static int staticMember = staticMethod();
static {
System.out.println("Test的 静态代码块");
}
{
System.out.println("Test的 构造代码块");
}
public int memberVar = memberMethod();
public static void main(String[] args) {
System.out.println("执行main方法");
ClassB b = new ClassB();
b.excute();
}
private static int staticMethod() {
System.out.println("Test的 静态变量");
return 0;
}
private int memberMethod() {
System.out.println("Test的 非静态变量");
return 0;
}
}
执行结果
1.加载main方法所在类
a. 静态变量、静态代码块(顺序与代码顺序一致)
b.执行main方法
2.父类的静态变量、静态代码块(顺序与代码顺序一致)
3.子类的静态变量、静态代码块(顺序与代码顺序一致)
4.父类的非静态变量、构造代码块(顺序与代码顺序一致)
5.父类的构造方法
6.子类的非静态变量、构造代码块(顺序与代码顺序一致)
7.子类的构造方法
(子类对象创建完毕)
总结
第一点,所有的类都会优先加载基类
第二点,静态成员的初始化优先
第三点,成员初始化后,才会执行构造方法
第四点,静态成员的初始化与静态块的执行,发生在类加载的时候。
第四点,类对象的创建以及静态块的访问,都会触发类的加载
参考
https://blog.csdn.net/weixin_37766296/article/details/80545283