package com.myclass.src;public class StaticDemo {
static int a = 3;
static int b;
//b = 6;
static void meth(int x) {
System.out.println("x = " + x);
System.out.println("a = " + a);
System.out.println("b = " + b);
} static {
System.out.println("Static 块开始");
b = a * 4;
} public static void main(String args[]) {
System.out.println("main 开始");
meth(42);
}
}
static int a = 3;
static int b;
//b = 6;
static void meth(int x) {
System.out.println("x = " + x);
System.out.println("a = " + a);
System.out.println("b = " + b);
} static {
System.out.println("Static 块开始");
b = a * 4;
} public static void main(String args[]) {
System.out.println("main 开始");
meth(42);
}
}
main 开始
x = 42
a = 3
b = 12
虚拟机运行是先进行类加载,所以静态代码块在类加载是就运行一次,而且就运行一次
然后才是主方法运行
先初始化静态成员变量和静态初始化块,在main中,在调用静态方法meth()之前,b已经由静态初始化块得到初始化。
静态初始化顺序一般是(静态变量,静态初始化块)先于(成员变量,初始化块)先于(构造函数)
package com.luowei.test2.test;public class OrderTest {
public static void main(String[] args) {
new Child2();//静态块在这执行了
System.out.println("-----------------------");
new Child2();//静态块已经在上面执行了,所以在这就不执行了
}}class Parent {
static {
System.out.println("parent static block");
} public Parent() {
System.out.println("parent constructor");
}
}class Child extends Parent{
static{
System.out.println("child static block");
}
public Child(){
System.out.println("child constructor");
}
}class Child2 extends Child{
static{
System.out.println("chile2 static block");
}
public Child2(){
System.out.println("child2 constructor");
}
}