黑马程序员技术交流社区
标题:
多态中出现的一个问题
[打印本页]
作者:
天空音乐
时间:
2014-12-29 15:45
标题:
多态中出现的一个问题
代码如下
class sudu
{
public static void main(String[] args)
{
fu z = new zi();
z.show();
System.out.print(z.b);
}
}
class fu
{
int d = 10;
int b = 20;
void show(){
System.out.println("fu_show");
}
}
class zi extends fu
{
int c = 50;
int b = 60;
void show(){
System.out.println("zi_show");
}
}
复制代码
为什么运行结果是zi_show 20而不是zi_show 60????
作者:
常强儿
时间:
2014-12-29 17:04
因为这里的z是一个fu类型的,使用fu类型的引用是不能得到其子类的成员变量的,但是通过多态可以访问子类的部分方法(多态是针对方法的,不能推广到成员变量)
PS:命名和格式挺考验人的。
作者:
duluhua
时间:
2014-12-29 19:00
子类可以继承父类的成员变量和成员方法,如果子类中有与父类相同的成员变量和成员方法的时候。
父类的引用会调用的是父类的成员变量,而方法则是调用子类的,因为子类的方法是对父类方法的重写。我也不是很理解,只能暂时先记住结果了。
作者:
Afridoce
时间:
2014-12-29 21:28
覆盖是出现在父类与子类方法之间的,成员变量并没有覆盖一说。因此父类引用不会去调用子类的成员变量,并且父类中没有这个成员变量的话也不会去子类中查找,编译时报错。在这里会产生这个疑问,是因为没有把覆盖的定义理解清楚。
作者:
红楼
时间:
2014-12-29 21:32
成员变量 编译运行都看左边
作者:
Honelyboy
时间:
2014-12-29 23:11
多态时方法的调用编译看左边,运行看右边。变量都看左边。
作者:
qowoeo7538
时间:
2014-12-29 23:43
变量是不能被复写的.
作者:
叫我王大锤
时间:
2014-12-30 00:14
编译看左边,运行看右边。
作者:
7788665544
时间:
2014-12-30 00:46
成员变量编译运行都看左边。。
作者:
yninggis
时间:
2014-12-30 01:04
z是父类型的引用,它指向了子类对象。它能能直接访问父类的变量,不能直接访问子类变量,所以输出的是20而不是60。如果要调用子类的成员变量,必须对z做强制类型转换成子类引用:zi a = (zi)z; System.out.print(a.b)的结果就是60。
欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/)
黑马程序员IT技术论坛 X3.2