标题: 涉及到继承和多态的问题 [打印本页] 作者: 明月几时有 时间: 2013-11-17 23:07 标题: 涉及到继承和多态的问题 class A {
void fun1() {
System.out.println(fun2());
}
int fun2() {
return 123;
}
}
public class B extends A {
int fun2() {
return 456;
}
public static void main(String args[]) {
B b = new B();
b.fun1();//这里的结果是456
A a = b;//这是多态?父类引用指向子类对象?
a.fun1();//这里居然也是456
}
}
//碰到这样一题,有点乱,求懂的朋友帮我分析一下结果和原理作者: 付凯鹏 时间: 2013-11-17 23:19
* 分析原理:
* 当子类对象b调用fun1()方法时现在子类中寻找发现没有这个方法,就去父类中找发现有fun1方法
* 就调用父类中的方法,父类中fun1()方法调用了fun2()方法,就为子类对象b在调用fun2();
子类中的fun2()将父类中的fun2()重写,输出456
当父类引用指向子类的对象时,父类引用只能访问父类中的方法和变量,无权访问子类中定义而父类中
没有的方法,当子类中有与父类相同的方法,子类的方法将父类的方法重写,父类的方法无效。(多态的动态连接)
故父类对象调用fun1()在父类中找到后运行,之后调用fun2()子类中fun2方法重写父类中fun2方法,父类中的fun2方法就没用了,运行子类的fun2()方法,输出456作者: 胡乃锋 时间: 2013-11-17 23:22
//创建B类对象实例,将引用值传给b,引用值就类似于一个指针
B b = new B();
//调用父类fun1()方法,因为B继承A,然后fun1()在调用子类fun2()
b.fun1();
//将b的引用值赋值给A类对象 的引用a
A a = b;
//调用A类方法 fun1(),fun1()在调用子类B fun2()
a.fun1();
多态体现在覆写和重载,
重载就是方法签名相同,参数类型不同;
覆写就是在子类中对父类继承来的方法进行 自己的实现, 当子类覆写父类方法后 调用的就是子类的方法。
多态就是子类有的用子类的,子类没有在用父类的。作者: 不抛弃不放弃 时间: 2013-11-17 23:46
类B继承了类A ,就拥有了A类中的方法,当B b = new B()创建子类对象,子类对象b调用fun1()也就是父类的方法fun1(),父类中的方法又调用了子类的fun2()方法,所以打印456. 父类A a=b 就如你说的这就是多态,父类引用指向了子类对象。a调用fun1()方法,调用的就是父类中的fun1(), 这里你疑惑说明对基本概念还不理解。父类引用指向子类对象时,如果父类的引用调用的方法没有被子类重写,就会调用父类中的方法。如果子类中重写了父类的方法,就会调用子类重写的方法。