关于JAVA Static的初始化顺序(及递归错误)
package com.cisco.learning;
class ClassOne{
//去掉static将产生StackOverflowError
//因为有了静态修饰,导致不会第二次初始化。
private static ClassOne classOne=new ClassOne();
ClassOne(){
System.out.println("ClassOne Constructor");
}
}
class ClassTwo{
private static int i=getMethod();
private static int getMethod() {
// TODO Auto-generated method stub
System.out.println("ClassTwo static");
return 0;
}
}
public class CopyOfTestStatic {
/**
* @param args
*/
public static void main(String[] args) {
new ClassOne();
System.out.println("________");
new ClassOne();
}
//没有打印ClassTwo static,说明没有创建对象时(或访问静态域),不会初始化静态成员
/*//
* ClassOne Constructor
ClassOne Constructor
说明先初始化了静态域,而且以后不再初始化,所以不会产生递规StackOverflowError。
________
ClassOne Constructor*/
}
package com.cisco.learning;
import java.util.Calendar;
public class Elvis {
private static final int i=10;
public static final Elvis INSTANCE = new Elvis();
private final int beltSize;
private static final int CURRENT_YEAR = Calendar.getInstance().get(
Calendar.YEAR);
private Elvis() {
System.out.println(i);
beltSize = CURRENT_YEAR - 1930;
}
public int beltSize() {
return beltSize;
}
/*10
Elvis wears a size -1930 belt.
说明,当访问静态域或者NEW()时,Class的静态部分就开始初始化;*/
public static void main(String[] args) {
System.out.println("Elvis wears a size " + INSTANCE.beltSize()
+ " belt.");
}
}