应该输出100
这种现象叫 屏蔽(shadow)
如果你想访问父类的i 
可以用
super.i;

解决方案 »

  1.   

    当子类和父类中有同名成员变量时,父类成员变量将被隐藏,可以用super 这个关键字来引用被隐藏了的变量
    所以楼主的题中,父类变量i被隐藏,那么结果就该是100,10
      

  2.   

    来晚了,呵呵。ASPserver(代码研究员) 说的很清楚了
      

  3.   

    class A {
        int v = 10;
    }class B extends A {
        int v = 100;
    }public class Test {
        public static void main(String[] args) {
            A a = new A();
            B b = new B();
            A c = new B();        System.out.println("a.v = " + a.v);
            System.out.println("b.v = " + b.v);
            System.out.println("c.v = " + c.v);
        }
    }看这个例子,输出是
    a.v = 10
    b.v = 100
    c.v = 10也就是说,对于成员变量,是根据引用类型来调用的,而不是根据实际的类类型来调用的。你们看,c 实际是 B 的对象,但是是 A 类型的引用,结果输出来的是 A 中定义的 v 的值。这就很明显了。其原因,对于成员变量,只有隐藏一说,并不能重载/改写,而对于方法,才有改写一说。再看两个例子,看看他们的结果:
    其一:
    class A {
        int v = 10;    public int getV() {
            return v;
        }
    }class B extends A {
        int v = 100;
    }public class Test {
        public static void main(String[] args) {
            A a = new A();
            B b = new B();
            A c = new B();        System.out.println("a.v = " + a.getV());
            System.out.println("b.v = " + b.getV());
            System.out.println("c.v = " + c.getV());
        }
    }结果是:
    a.v = 10
    b.v = 10
    c.v = 10注意,我只给 A 定义了 getV() 方法,所以不管什么对象什么引用,都是调用的 A 的 getV() 方法,而 A 的 getV 只能访问到 A 的 v。那么再来看看第二个例子,在 B 中重载了 getV() 方法:class A {
        int v = 10;    public int getV() {
            return v;
        }
    }class B extends A {
        int v = 100;    public int getV() {
            return v;
        }
    }public class Test {
        public static void main(String[] args) {
            A a = new A();
            B b = new B();
            A c = new B();        System.out.println("a.v = " + a.getV());
            System.out.println("b.v = " + b.getV());
            System.out.println("c.v = " + c.getV());
        }
    }结果是:
    a.v = 10
    b.v = 100
    c.v = 100这是因为方法是要卖实际类型来调用的,因为 b 和 c 的实际类型都是 B,所以调用了 B 的 getV() 方法,这个方法中访问到的是 B 的 v 值,所以输出100。