/**
* 类中实例化本类必须要用static关键词修饰,否则会陷入无限迭代
* 这个例子也解释了枚举类的构造器中为什么不能引用static变量
*
*/
class A {
/**
* 本句话的解释:
* 执行到这句话时会跳过本句话后static修饰的域的初始化,
* 但是普通的域初始化不会跳过,然后再调用本类构造器
*/
public static A a = new A("a");
{
System.out.println("haha");
}
static{
System.out.println("static");
}
private static Object obj = new Object();
private static int j = haha("j");
{
System.out.println("haoba");
}
public static A b = new A("b");
public A(String s) {
System.out.println(s + ":" + obj);
}
public static int haha(String s){
System.out.println(s);
return 3;
}
}
public class Main {
public static void main(String[] args) {
// TODO Auto-generated method stub
// System.out.println(A.i);
new A("c");
}
}//output:
haha
haoba
a:null
static
j
haha
haoba
b:java.lang.Object@8bfc25c
haha
haoba
c:java.lang.Object@8bfc25c
在此也简单说下类的加载:
任何调用类中static域的行为都会引起该类的加载(我们也可以认为构造器也是static关键词修饰的),加载的顺序是:先加载static成员变量,再加载普通成员变量(如果调用的是构造器),最后调用构造器。
本文章仅限于记录问题