我又想到一点 B既然继承了A,而A里有变量i,B里也应该有i,可此时又声明i,不是重复了吗

解决方案 »

  1.   

    多态说的是运行时动态绑定,指的是method,而非field。
    field只有静态绑定,不存在多台这个说法。
      

  2.   

    所谓的静态绑定就是说:变量声明的类型就是实际的类型,因此,a.i获取到的是A里面的i,b.i获取到的是B里面的i。public class Test {
    static class A {
    public int i = 10;
    public int getI(){
    return this.i;
    }
    }
    static class B extends A {
    public int i = 20;
    public int getI(){
    return this.i;
    }
    }
    public static void main(String args[]) {
    B b = new B();
    A a = b;
    System.out.println(b.i);//20
    System.out.println(a.i);//10
    System.out.println(b.getI());//20
    System.out.println(a.getI());//20 方法才会有多态
    }
    }
      

  3.   

    多态表现并实现于方法层面(运行期绑定),而变量则是静态(编译期绑定),父类子类各自维护自己的变量。
    但static和final(所有private默认是final的)修饰的方法也是静态绑定的.
      

  4.   

     B既然继承了A,而A里有变量i,B里也应该有i,可此时又声明i,不是重复了吗   这个是怎么回事
      

  5.   

    B既然继承了A,而A里有变量i,B里也应该有i,可此时又声明i,不是重复了吗   这个是怎么回事
      

  6.   

    B继承了A,B里面会包含A的所有的field,B也会有自己的field,虽然是叫同一个名字,但是,是不会相互覆盖的。
      

  7.   

    B既然继承了A,而A里有变量i,B里也应该有i,可此时又声明i,不是重复了吗   这个是怎么回事父类,子孙类各自维护自己的变量i,在4楼同学的getI()方法中引用this则是当前对象b,不管它是否被父类引用a所引用。所以,a.i=10,this.i=20.
      

  8.   


    public class test{
       public int i=10;
       public int i=20;
    }
    不就相当于这样吗 这样显然是不行的啊
      

  9.   

    子类里申明的变量和父类里同名,这种做法是去隐藏父类继承来的属性,而在使用时,使用自身定义的这个。如果要调用父类的就用super关键字
      

  10.   

    你想啊,你不在子类里定义i,那你b.i取到的就是a类中定义好的i,我想要自己的i,那我就在b中定义一个,把继承来的影藏了,在b.i取得就是想要的那个值
      

  11.   

    终于明白了 可以结贴了  感谢goldenfish1919 ,redcenter,lilei0303等人的耐心回答