Java代码执行顺序
package test; public class Animal { private int i = test(); private static int j = method(); static { System.out.print("a"); } Animal() { System.out.print("b"); } { System.out.print("c"); } public int test() { System.out.print("d"); return 1; } public static int method() { System.out.print("e"); return 1; } }
package test; public class Dog extends Animal { private int i = test(); static { System.out.print("f"); } private static int j = method(); { System.out.print("h"); } Dog() { System.out.print("g"); } public int test() { System.out.print("i"); return 1; } public static int method() { System.out.print("j"); return 1; } public static void main(String[] args) { // 1. 父类静态变量显式赋值、父类静态代码块(按定义顺序) // 2. 子类静态变量显式赋值、子类静态代码块(按定义顺序) // 3. 父类非静态变量显式赋值(父类实例成员变量)、父类非静态代码块(按定义顺序) // 4. 父类构造函数 // 5. 子类非静态变量(子类实例成员变量)、子类非静态代码块(按定义顺序) // 6. 子类构造函数。 Dog dog = new Dog(); //eafjicbhig System.out.println(); Dog dog1 = new Dog(); //icbhig } }
--------------------------------------------------------------------
引用类的final静态基本类型字段不会引发类初始化,但如果是引用final类型对象常量,则会引发类初始化
import java.util.Date; public class CTest { static class A { public static final int a = 1; public static final Date b = new Date(); public static int c = 2; static { System.out.println("init Class A"); } } public static void main(String[] args) { System.out.println("A.a=" + A.a); System.out.println("A.b=" + A.b); System.out.println("A.c=" + A.c); } }
结果
A.a=1 init Class A A.b=Mon Aug 02 16:45:22 CST 2021 A.c=2
public class Test { private static Test obj = new Test(); private static int counter1 = 0; public Test() { System.out.println("2222222"); counter1++; } public static Test getInstance() { System.out.println("1111111"); return obj; } public static void main(String[] args) { Test obj = Test.getInstance(); System.out.println(obj.counter1); } }
2222222
1111111
0

浙公网安备 33010602011771号