本帖最后由 maytears 于 2009-11-19 21:06:07 编辑

解决方案 »

  1.   

    static修饰的是表态变量,即只初始化一次,所以第二次NEW时就不会打印了的。只回答第一个问题
      

  2.   

    第一个问题:
    这是一个类加载到虚拟机的问题,当你new一个类的对象的时候,虚拟机会检测这个对象的类有没有加载进入到虚拟机,如果没有即加载这个类,如果有就不再加载,而当加载一个类进入到虚拟机的时候,虚拟机会先检测这个类的父类有没有加载进入到虚拟机,如果没有就加载,如果有就不加载,这种递归过程直到java.lang.Object类为止,因为java.lang.Object类没有父类。
    而当一个类加载进入虚拟机以后,虚拟机会对他进行初始化操作,初始化操作是执行初始化方法<clinit>()方法,这个方法由编译器自动完成,static{}块是这个方法的一部分。
    所以你第一次new这个类对象的时候,会执行类的static{}块内的代码,而父类先被加载,所以先执行父类的static块内的方法。而第二次new对象的时候,类都已经被加载了,所以不会再执行static块内的方法了。
    第二个问题:
    当两个接口有同名方法,而又被同一个类继承时会出现编译错误,所以你需要改掉方法名字,如果你无法改名字,那么你只能用组合的方式解决这个问题,一个类实现A,另一个类实现B,然后A或者B引用另外一个类的对象。
      

  3.   

    错了,static修饰的是静态变量,不是表态变量。
      

  4.   

    问题一,
    static就是要保证你第一次创建对象的时候,更恰当说是创建第一个对象之前执行一次,且一次!
    其他的纯粹是顺序问题,当然是父类的构造先于子类的,因为像猫和动物两种概念的关系,猫首先是一种动物。它必须要符合一个动物的条件,然后才是猫的条件。问题二
    优化? 老实说,从你问的第一个问题来看,你现在不适合理解接口。