下面代码输出的结果是什么?为什么?麻烦详细解释。

class A {
int m;
int getM(){
return m;
}
int seeM(){
return m;
}
}
class B extendsA{
int m;
int getM(){
return m+100;
}
}
public class E {
public static void main(String args[])
B b=new B();
b.m=20;
System.out.println(b.getM());
A a=b;
a.m=-100;
System.out.println(a.getM());
System.out.println(b.getM());
}
}

全部是120,首先分析下,System.out.println(b.getM());当运行到此处的时候,上面的B b=new B();b.m=20;两行代码已经为B的对象b中的属性字段m赋值为20,此时再调用b.getM()就是运行下面的程序int getM(){return m+100;}返回的结果自然是120,之后在A a=b;这段代码中,是将子类的对象b赋给了父类的对象a其实就是,父类的对象a也指向了子类b的对象。这个时候 a.m=-100;只是给a中的属性字段m设了初值为-100,到这一行的时候,System.out.println(a.getM());a其实指向的是子类对象b,所以a.getM()就等同于b.getM(),而b中的m=20,继续返回120.最后一个一样!!!有点抽象。。。希望你能理解!Debug的时候Eclipse必须把对象保存起来,然后等待你的操作,在保存对象的时候会为每个对象分配ID进行分辨,你可以进入debug模式跟踪下程序,可以看出系统给a,b分配的ID是一样的额!追问

可是标准答案最后一个是-100?

追答

不可能啊。。。程序跑出来的就是120.。怎么会是-100,你可以自己跑跑看啊。。我只想说:实践大于理论,你难道怀疑人家开发的eclipse工具有问题。。。

温馨提示:答案为网友推荐,仅供参考
第1个回答  2014-01-05
b.getM()。。。。返回值是120.。。。。这个就不多说了
关键是A a=b;。。。此时a其实的类型也是B。。。就相对于一个指针直到b。。就相对于a和b同时指向一个对象
所以后面两个打印出来的也应该都是B类的方法。。。所以都是120