public static int getNext(int base) { System.out.println("parent的static int getNext(int base)被调用"); System.out.println(iy); System.out.println(iz); return ++base; }
public static void t() { System.out.println("parent的static void t被调用"); System.out.println(iz);
}}
public class Parent { //第零步,首先定义iz,iy两个变量,并初始化为0(因为是int类型,如果是对象则为null) private static int iz = getNext(2); //第一步,因为有方法调用,所以转到方法,即第二步 private static int iy=99; //第三步 //静态初始化块 static //第四步 { System.out.println("parent的静态初始化块"); System.out.println(iz); //这里因为第二步,iz=3 System.out.println(iy); //这里因为第三步,iy=4 } public static int getNext(int base) //第二步,方法调用 { System.out.println("parent的static int getNext(int base)被调用"); System.out.println(iy); //iy初始化为0 System.out.println(iz); //iz初始化也为0,这里就说明先走变量定义,对于int类型,初始化为0 return ++base; } public static void t() //这里没有执行,这就说明了,方法不调用,就不会被加载,所以如果第一步不调用getNext方法,第二步就不会执行,就会直接到第三步 { System.out.println("parent的static void t被调用"); System.out.println(iz); } }
有方法调用的时候,先静态变量(静态处理块)后静态方法
最简单的例子public class Test {
static String s = "test";
static {
System.out.println("before main: s=" + s);
}
public static void main(String[] args) {
System.out.println("in main: s=" + s);
s = "changed";
System.out.println("after change: s=" + s);
}
}
...
}
这样的静态块是一旦加载类即执行的
静态变量是由一个静态方法的返回值来初始化,那你这个静态变量也有初始值null的。
---------------------
当然还是先初始化变量了,只不过是初始化为null而已,调用完静态方法后,再把返回值赋给变量。
private static int iz = getNext(2);
private static int iy=99;
//静态初始化块
static
{
System.out.println("parent的静态初始化块");
System.out.println(iz);
System.out.println(iy);
}
public static int getNext(int base)
{
System.out.println("parent的static int getNext(int base)被调用");
System.out.println(iy);
System.out.println(iz);
return ++base;
}
public static void t()
{
System.out.println("parent的static void t被调用");
System.out.println(iz);
}}
public class Parent {
//第零步,首先定义iz,iy两个变量,并初始化为0(因为是int类型,如果是对象则为null)
private static int iz = getNext(2); //第一步,因为有方法调用,所以转到方法,即第二步
private static int iy=99; //第三步
//静态初始化块
static //第四步
{
System.out.println("parent的静态初始化块");
System.out.println(iz); //这里因为第二步,iz=3
System.out.println(iy); //这里因为第三步,iy=4
} public static int getNext(int base) //第二步,方法调用
{
System.out.println("parent的static int getNext(int base)被调用");
System.out.println(iy); //iy初始化为0
System.out.println(iz); //iz初始化也为0,这里就说明先走变量定义,对于int类型,初始化为0
return ++base;
} public static void t() //这里没有执行,这就说明了,方法不调用,就不会被加载,所以如果第一步不调用getNext方法,第二步就不会执行,就会直接到第三步
{
System.out.println("parent的static void t被调用");
System.out.println(iz); } }