public class T {   
  static class t1 {   
    public int i = 5;   
  
    public int printA() {   
      return i;   
    }   
  }   
  
  static class t2 extends t1 {   
    public int i = 100;   
  
    public int printB() {   
      return i;   
    }   
  
    public void printC() {   
      {   
        System.out.println(super.i);   
      }   
    }   
  }   
  
  public static void main(String... args) {   
    t1 t = new t1();   
    t2 tt = new t2();   
    tt.printC();                     //5
    System.out.println(tt.printB()); //100  
    System.out.println(t.printA());  //5 
    System.out.println(tt.printA()); //5  不明白这里为啥是5而不是100?
    t1 ttt = (t1) tt;   
    System.out.println(ttt.printA());//5   
  }   
  
}  

解决方案 »

  1.   


    public class T {   
      static class t1 {   
        public int i = 5;   
     
        public int printA() {   
         System.out.println("t1.printA()"); 
          return i;  
        }   
      }   
      
      static class t2 extends t1 {   
        public int i = 100;   
        public int printB() {   
         System.out.println("t2.printA()"); 
          return i;  
        }   
      
        public void printC() {   
          {   
            System.out.println(super.i);   
          }   
        }   
      }   
      
      public static void main(String... args) {   
        t1 t = new t1();   
        t2 tt = new t2();   
        tt.printC();  //
        System.out.println(tt.printB()); //
        System.out.println(t.printA());  //
        System.out.println(tt.printA()); //  
        t1 ttt = (t1) tt;   
        System.out.println(ttt.printA());//   
      }     
    }      结果是这样的,现在能理解了吧?
                 5
                 t2.printA()
                 100
                 t1.printA()
                 5
                 t1.printA()
                 5
                 t1.printA()
                 5
      

  2.   

    “System.out.println(tt.printA()); //5  不明白这里为啥是5而不是100?”虽然tt属于t2类的实例,但是t2继承了t1中的方法int printA();t1中的成员变量又是public的(通常设置为private),所以,在tt.printA()时,会返回t1中定义的域值5。