黑马程序员技术交流社区

标题: 关于多态的问题 [打印本页]

作者: java陈辉    时间: 2013-12-19 21:14
标题: 关于多态的问题
下面这段代码为什么调用的B类中的run()方法,而不是A类中的run()方法?求解释。
public class DuoTaiDemo {

        public static void main(String[] args) {
            A a=new B();            
        a.show();        //这里调用的是A类中的show()方法。   
        a.run();       //这里为什么不是调用A类中的run()方法,而是调用了B类中的run()方法。

        }
}
class A{
        public void show(){
                System.out.println("show A");
        }
        public void run(){
                System.out.println("run A");
        }
}
class B extends A{
        public void run(){
                System.out.println("run B");
        }
       
}


作者: 张利星    时间: 2013-12-19 21:41
多态中成员的特点:
在多态中,当父类引用指向子类对象时即Fu f = new Zi();用父类引用调用子父类中同名成员时
A:成员变量:编译和运行都看Fu。
B:非静态方法:编译看Fu,运行看Zi。
C:静态方法:编译和运行都看Fu。
作者: 松毛    时间: 2013-12-19 21:48
这是多态的特性。由于B继承了A,父类引用指向子类对象,当调用a.run()时,由于子类中的run方法覆盖了父类中的run方法,所以就会执行子类中的方法。在这里注意的是,当父类中的run方法为静态时,在无论子类是否覆盖则都会执行父类中的run方法。1、在多态中成员函数的特点:
在编译时期(父类引用指向子类对象):参阅引用型变量所属的类中是否有调用的方法,如果有,编译通过,如果没有编译失败。
在运行时期:参阅对象所属的类中是否有调用的方法。
简单总结:成员函数在多态调用时,编译看左边,运行看右边。
2、在多态中,成员变量的特点::
无论编译和运行,都参考左边(引用型变量所属的类)。
3、在多态中,静态成员函数的特点:无论编译和运行,都参考左边。








作者: 一年之后    时间: 2013-12-19 22:27
我说一下毕老师讲那个,A和B就是爹和儿子继承关系,A a =new B()就相当于,儿子伪装程父亲,父亲能做的事情事情。私有除外。儿子现在都能做,父亲有个功能是授课--父类中的run(),是教数学的,儿子也有个功能是授课,是教JAVA的--子类中的run(),儿子伪装成父亲去讲课---a.run() ,儿子不懂数学,他只能讲java。所以a.run()调用的是子类的run()方法。
作者: 闭眼就天黑    时间: 2013-12-19 23:22
一句话:因为你new的是B(),所以是B的方法。在B中已经把A的方法覆盖掉了
作者: 城市儒侠    时间: 2013-12-19 23:57
由于B继承了A,A a=new B();  就产生了父类引用指向子类对象的情况。

所以当你的程序a.run()时,由于子类中的run方法覆盖了父类中的run方法,所以就会执行子类中的方法。

这里边你要记住老师总结的那句话:编译看左边,运行看右边。


作者: 恨死我了    时间: 2013-12-20 09:19
记住个规律就行
在多态中成员函数的特点:
在编译时期:参阅引用型变量所属的类中是否有调用的方法。如果有,编译通过,如果没有编译失败。
在运行时期:参阅对象所属的类中是否有调用的方法。
简单总结就是:成员函数在多态调用时,编译看左边,运行看右边。
在多态中,成员变量的特点:
无论编译和运行,都参考左边(引用型变量所属的类)。
在多态中,静态成员函数的特点:
无论编译和运行,都参考做左边。
如果把继承去掉编译就会失败了。
作者: 品尝无奈    时间: 2013-12-20 10:11
这是多态的特点,父类引用指向子类对象,当调用的是方法时,只要子类 有就都调用子类的,子类没有就调用继承自父类的方法,但调用变量时都是调用的父类的
作者: 弘一    时间: 2013-12-20 10:20
多态中的成员特点:
                A:成员变量
                        编译看左边,运行看左边。
                B:成员方法
                        编译看边,运行看右边。

class B extends A{
        //这哥们继承来自于A中
        public void show(){
                System.out.println("show A");
        }
        /*这哥们需要也是继承来自于A,但是B把他重写了。也就是在B中没有了
        public void run(){
                System.out.println("run A");
        }
        */
        //所以现在运行这个哥们       
        public void run(){
                System.out.println("run B");
        }
}




欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/) 黑马程序员IT技术论坛 X3.2