class b{
static int j = printInit("A.j initialized");
static int printInit(String s) {
System.out.println(s);
return 1;}
}public class a extends b{
}
/**
* @param args
*/
public static void main(String[] args) {
// TODO Auto-generated method stub
}
} 没有创建任何对象啊,为什么输出结果是A.j initialized
如果去掉extends b不继承b类了就没有输出了。不懂
static int j = printInit("A.j initialized");
static int printInit(String s) {
System.out.println(s);
return 1;}
}public class a extends b{
}
/**
* @param args
*/
public static void main(String[] args) {
// TODO Auto-generated method stub
}
} 没有创建任何对象啊,为什么输出结果是A.j initialized
如果去掉extends b不继承b类了就没有输出了。不懂
java对待静态成员的方法是,
只要用到了某个类(需要实例化或者被继承),
就先扫描一下,
有静态的东西就先“做”掉。
比如静态变量的初始化,静态代码块的执行等等。然后再等待这个类被实例化。去掉extends之后,
在编译的时候就不会有这个b类的“类型”,
也就是用不到b了,
也就是没有输出了。这是我个人的理解,可能太“土”了一点,
(没准也是错的,呵呵)
期待dx给出更标准的答案,俺也借lz宝地学习学习,呵呵good luck
的 static 方法 main
所以 它的父类的 static 成员变量 也被初始化每当类的 static成员(成员变量或方法)被访问的时候 就自动开始初始化
先初始化 父类的 static 成员变量 如果还有父类 就依此类推 但初始化 尽可能的 实现了 惰性
比如 访问 static final int i=1; 类似的编译时 常量 那么就不进行 初始化
但 光 static final 修饰 是不够的
static final int j = printInit("A.j initialized");
当 j 被第一次 访问时 初始化 就开始了