当前位置: 技术问答>java相关
这有一道题,请教大家
来源: 互联网 发布时间:2015-04-11
本文导语: class Test{ public static void main(String [] args){ Base b = new Subclass(); System.out.println(b.x); System.out.println(b.method()); } } class Base{ int x = 2; int ...
class Test{
public static void main(String [] args){
Base b = new Subclass();
System.out.println(b.x);
System.out.println(b.method());
}
}
class Base{
int x = 2;
int method(){
return x;
}
}
class Subclass extends Base{
int x = 3;
int method(){
return x;
}
}
为什么输出是2,3呢?
public static void main(String [] args){
Base b = new Subclass();
System.out.println(b.x);
System.out.println(b.method());
}
}
class Base{
int x = 2;
int method(){
return x;
}
}
class Subclass extends Base{
int x = 3;
int method(){
return x;
}
}
为什么输出是2,3呢?
|
是多态性问题,
b实际指向的是一个subClass类(子类)的对象,其上溯造型到base(父类)
此时,b(儿子)是以父亲的身分出现,别人要访问b的属性时,得到的当然是父亲的属性值,也就是b.x为2
而b.method()方法执行的是b儿子的方法,因为父亲能做的事,儿子可不一定会啊,所以返回的是3.
b实际指向的是一个subClass类(子类)的对象,其上溯造型到base(父类)
此时,b(儿子)是以父亲的身分出现,别人要访问b的属性时,得到的当然是父亲的属性值,也就是b.x为2
而b.method()方法执行的是b儿子的方法,因为父亲能做的事,儿子可不一定会啊,所以返回的是3.
|
有2是因为-变量覆盖和方法覆盖-有区别,不论你实际上赋给b的是什么,b.x都指向b类的实例变量,而b.method()在会动态寻找到子类的方法。这个问题就这么解释了,具体可以看看关于对象模型的书。
|
b被造型成Base后,b.x指的是Base的x,但是Base的method方法被subclass覆盖了,所以当调用b.method()时调用的是subclass的。如果你不覆盖method,你就可以运行Base中的方法了