Bowl(1)
Bowl(2)
Table()
f(1)
Bowl(4)
Bowl(5)
Bowl(3)
Cupboard()
f(2)
Creating new Cupboard() in main
Bowl(3)
Cupboard()
f(2)
Creating new Cupboard() in main
Bowl(3)
Cupboard()
f(2)
f2(1)
f3(1)先运行static区的语句
static Table t2 = new Table();
static Cupboard t3 = new Cupboard();
所以这两个是先被调用的,且是只被调用一次,其他的同理。(可以认为这是在编译时被执行的)
Bowl b3 = new Bowl(3);这个不是static的,所以会多次被调用(运行时被执行)

解决方案 »

  1.   

    运行"new Cupboard"时,为什么会输出Bowl(3),他并不是这个类的构造函数
      

  2.   

    一个类调用顺序如下
    1.当类被装入jvm的时候,static的代码执行一次,以后就不再执行
    class a{
    static int i=33;
    static {
    System.out.println("abc\n"+i);
    }
    a(){
    System.out.println("c");
    }
    }
    2.构造函数头执行
    3.实例变量和代码段执行
    4.构造函数执行
      

  3.   

    这个例子体现了类变量和实例变量的区别:
    类变量即在变量前有"static"修饰,没有的即为实例变量;
    类变量在每个类中只出现一次,不管这个类创建了多少实例,它使用的内存仅分配一次;
    而实例变量是为类的每个实例分配的,在创建类的实例时,系统就为这个类中的所有实例变量分配内存。
    在上面的例子中,由于b3是实例变量,所以每分配一个实例,就创建一个新的b3,所以它的输出是多次的