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类了就没有输出了。不懂

解决方案 »

  1.   

    据我了解,
    java对待静态成员的方法是,
    只要用到了某个类(需要实例化或者被继承),
    就先扫描一下,
    有静态的东西就先“做”掉。
    比如静态变量的初始化,静态代码块的执行等等。然后再等待这个类被实例化。去掉extends之后,
    在编译的时候就不会有这个b类的“类型”,
    也就是用不到b了,
    也就是没有输出了。这是我个人的理解,可能太“土”了一点,
    (没准也是错的,呵呵)
    期待dx给出更标准的答案,俺也借lz宝地学习学习,呵呵good luck
      

  2.   

    你访问了 a(以后还是改成A 吧)
    的 static 方法 main
    所以 它的父类的 static 成员变量 也被初始化每当类的 static成员(成员变量或方法)被访问的时候 就自动开始初始化
    先初始化 父类的 static 成员变量 如果还有父类 就依此类推 但初始化 尽可能的 实现了 惰性
    比如 访问 static final int i=1; 类似的编译时 常量 那么就不进行 初始化
    但 光 static final 修饰 是不够的 
    static final int j = printInit("A.j initialized");
    当 j 被第一次 访问时 初始化 就开始了