print:
A
1
但是我完全搞不懂为什么啊,B的静态代码块为什么不执行呢?

解决方案 »

  1.   

    jvm没有加载B类的class文件,在main方法在加System.out.println(B.b);可以执行B类static语句。
      

  2.   

    B.a 访问的是class A 的属性, 所以只载入了A,没有载入B, 访问B.b看看
      

  3.   

    恩,楼上两位说得对,但是为什么不加载B类呢。
    首先,我调用的是B类。
    其次,我会在B类的静态代码块中修改A类中变量的值。(没有语法规定不容许修改吧。)但是,JVM都不关心我会不会修改,直接只加载A类了事,为什么呢?
      

  4.   

    public class ClassLoaderTest {
    public static void main(String[] args) throws ClassNotFoundException {
    System.out.println(B.b);
    }
    }
    class A{
    static int a=1;
    static{
    System.out.println("A");
    }
    }
    class B extends A{
    static int b=2;
    static{
    System.out.println("B");
    }
    }print:
    A
    B
    2这个和上面那个类似,只是调的是b。但是为什么加载了A呢。
      

  5.   

    回复4楼:
    那是因为A是B的父类,又因为静态块要先于构造方法执行,所以先执行了静态块,但也是执行一次而已。这个没有为什么,很高容易理解,一个对象没有被new出来的时候,静态块(属于类级别的)就已经存在了,所以在先执行。找一本java入门的书看一看吧
      

  6.   

    静态语句块在jvm装载类时调用,B类还没有被装载,可以new B()试试。