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。
所以楼主的题中,父类变量i被隐藏,那么结果就该是100,10
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。