黑马程序员技术交流社区
标题: 多态问题,糊涂了!!! [打印本页]
作者: 吴琼 时间: 2012-6-17 17:11
标题: 多态问题,糊涂了!!!
class A {
void fun1() {
System.out.println(fun2());
}
int fun2() {
return 123;
}
}
class B extends A {
int fun2() {
return 456;
}
public static void main(String argv[]) {
A a;
B b = new B();
b.fun1();//子类创建自己对象,调用的是fun2()这个我知道.
a = b;//
a.fun1();//为什么多态中父类对象指向子类对象.调用的还是fun2();
}
}
作者: 张_涛 时间: 2012-6-17 17:20
当变量的编译时类型和运行时类型不同时,通过该变量访问它所引用的对象的实例变量时,该实例变量的值由声明该变量的类型决定。
通过该变量调用它所引用的对象的实例方法时,该方法行为将由它实际所引用的对象来决定。
此时通过父类声明的对象去调用一个父类中并没有存在的一个方法,编译肯定是通不过的。当父类也有这个方法的时候,去调用,那么它将去执行它实际所引用的对象中的方法。
作者: 张_涛 时间: 2012-6-17 17:21
所以a实际上引用的是子类对象,必然调用子类中的方法
作者: 车风波 时间: 2012-6-17 17:28
- class A {
- void fun1() {
- System.out.println(this.getClass().getName()); //输出B
- System.out.println(this.fun2());
- }
复制代码
作者: 石琪 时间: 2012-6-17 17:29
a=b 这个不是a指向b 而是 a等于b ,所以你下一行代码a.fun1()就相当于b.fun1() 这时就是子类b调用继承自a的fun1()方法,因为在子类b中重载了fun2()方法,打印出来当然就是456了。
另外楼主写代码加强点层次感,看的真的很费劲。
作者: 龙秋地 时间: 2012-6-17 17:41
楼主这句话在java中叫做向上转型.
所以既然是子类对象赋给了父类引用,那么调用的其实是调用的是子类复写之后的方法.
所以输出的是子类的456.而不是父类的123.
作者: 黑马-王言龙 时间: 2012-6-17 21:27
本帖最后由 wyl530274554 于 2012-6-17 21:31 编辑
成员函数在多态调用时,运行时,看右边
即new的是谁,就调用谁的方法。
a=b,
在这里a,b指向了同一个对象new B();
所以就调用B类里的方法fun2()
欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/) |
黑马程序员IT技术论坛 X3.2 |