class Base2{
      static  int value = 0;
        Base2(){
        addValue();
        }
    static void addValue(){
        value += 10;
        }
       int getValue(){
         return value;
       }
     }
    class Derived2 extends Base2{
      Derived2(){
       addValue();
      }
    static void addValue(){
     value +=  20;
      }
    }
    public class Test7 {
      public static void main(String[] args){
          Base2 b = new Derived2();
          System.out.println(b.getValue());
      }
    }
为什么输出 30
    class Base1{
        int value = 0;
        Base1(){
        addValue();
        }
        void addValue(){
        value += 10;
        }
       int getValue(){
         return value;
       }
     }
    class Derived1 extends Base1{
      Derived1(){
       addValue();
      }
     void addValue(){
     value +=  20;
      }
    }
    public class Test6 {
      public static void main(String[] args){
          Base1 b = new Derived1();
          System.out.println(b.getValue());
      }
    }
为什么输出 40

解决方案 »

  1.   

    为什么输出 30 
    初始化的顺序包括构造方法调用的顺序如下:  
      1.   Base2的静态成员value 首先初始化。  
      2.   Base2的构造方法按照从最高到最低的顺序被调用。  
      3.   Derived2的非静态对象(变量)初始化。  
      4.   调用Derived2的构造方法。   所以第一个先调用Base2()使value变成10,又调用Derived2()使value编程30
      

  2.   


    调试后发现
    第一段代码父类构造调用的是本类的静态方法addValue()
    i+=10;
    子类构造调用的是自己的静态方法addValue()
    i+=20;
    =30第二段代码父类构造调用的是重写后子类的addValue()方法。
    i+=20;
    子类构造调用的是自己的方法addValue()
    i+=20;
    =40借地方问一下重写后的静态方法为什么是这样调用的?
      

  3.   

    静态方法是Class自己的方法,不属于任何对象,也更不支持重载
    所以每一个类的addValue都是自己的按照Base2的构造方法按照从最高到最低的顺序被调用。每个构造函数调用的addValue()方法,都是属于自己的类本身的
      

  4.   

    静态方法不能被重写,但能被重新定义,就是说子类中static void addValue()与父类中的static void addValue()
    不存在重写的关系
    所以代码一中,Base2 b = new Derived2();父类的构造函数调用的就是他本身的的addValue()方法,value=10;
    代码二中,Base2 b = new Derived2(),由于子类重写了addValue()方法,所以父类的构造函数调用的就是子类的
    addValue()方法,value=20
      

  5.   

    你最好在Eclipse里面单步运行看看就知道了!