日期:2014-05-20  浏览次数:20692 次

请各位,一定要帮我看看,这个问题发了好几天了也没人能说出个道理来...............
class   A
{
String   name= "张三 ";
void   qq(A   a)
{
System.out.println(a.name);
}
public   static   void   main(String   args[])
{
A   a=new   A();
B   b=new   B();
a.qq(b);
}
}
class   B   extends   A
{
String   name= "李四 ";
}
请问一下,上面的程序为什么会输出张三啊?我是这么想的:B类继承了A类,并覆盖了A类的成员变量
name,a.qq(b)传递过去的是B类的实例,应当输出李四啊?

------解决方案--------------------
b虽然是B的实例,但使用a.name的时候,因为a是用A来引用的,Java会使用A类自己声明的实例变量name,因为父类对子类的内部是一无所知的。
还有就是访问一个对象的变量,这个没有覆盖不覆盖的说法,父类和子类都有一个name变量,在不同的内存地址,互不影响。