A股上市公司传智教育(股票代码 003032)旗下技术交流社区北京昌平校区

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© java陈辉 中级黑马   /  2013-12-19 21:14  /  1416 人查看  /  9 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

下面这段代码为什么调用的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");
        }
       
}

评分

参与人数 1技术分 +1 收起 理由
乔兵 + 1

查看全部评分

9 个回复

倒序浏览
多态中成员的特点:
在多态中,当父类引用指向子类对象时即Fu f = new Zi();用父类引用调用子父类中同名成员时
A:成员变量:编译和运行都看Fu。
B:非静态方法:编译看Fu,运行看Zi。
C:静态方法:编译和运行都看Fu。

评分

参与人数 1技术分 +1 收起 理由
乔兵 + 1

查看全部评分

回复 使用道具 举报
这是多态的特性。由于B继承了A,父类引用指向子类对象,当调用a.run()时,由于子类中的run方法覆盖了父类中的run方法,所以就会执行子类中的方法。在这里注意的是,当父类中的run方法为静态时,在无论子类是否覆盖则都会执行父类中的run方法。1、在多态中成员函数的特点:
在编译时期(父类引用指向子类对象):参阅引用型变量所属的类中是否有调用的方法,如果有,编译通过,如果没有编译失败。
在运行时期:参阅对象所属的类中是否有调用的方法。
简单总结:成员函数在多态调用时,编译看左边,运行看右边。
2、在多态中,成员变量的特点::
无论编译和运行,都参考左边(引用型变量所属的类)。
3、在多态中,静态成员函数的特点:无论编译和运行,都参考左边。







评分

参与人数 1技术分 +1 收起 理由
乔兵 + 1

查看全部评分

回复 使用道具 举报
我说一下毕老师讲那个,A和B就是爹和儿子继承关系,A a =new B()就相当于,儿子伪装程父亲,父亲能做的事情事情。私有除外。儿子现在都能做,父亲有个功能是授课--父类中的run(),是教数学的,儿子也有个功能是授课,是教JAVA的--子类中的run(),儿子伪装成父亲去讲课---a.run() ,儿子不懂数学,他只能讲java。所以a.run()调用的是子类的run()方法。

评分

参与人数 1技术分 +1 收起 理由
乔兵 + 1

查看全部评分

回复 使用道具 举报
一句话:因为你new的是B(),所以是B的方法。在B中已经把A的方法覆盖掉了
回复 使用道具 举报
由于B继承了A,A a=new B();  就产生了父类引用指向子类对象的情况。

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

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

评分

参与人数 1技术分 +1 收起 理由
乔兵 + 1

查看全部评分

回复 使用道具 举报
记住个规律就行
在多态中成员函数的特点:
在编译时期:参阅引用型变量所属的类中是否有调用的方法。如果有,编译通过,如果没有编译失败。
在运行时期:参阅对象所属的类中是否有调用的方法。
简单总结就是:成员函数在多态调用时,编译看左边,运行看右边。
在多态中,成员变量的特点:
无论编译和运行,都参考左边(引用型变量所属的类)。
在多态中,静态成员函数的特点:
无论编译和运行,都参考做左边。
如果把继承去掉编译就会失败了。

评分

参与人数 1技术分 +1 收起 理由
乔兵 + 1

查看全部评分

回复 使用道具 举报
这是多态的特点,父类引用指向子类对象,当调用的是方法时,只要子类 有就都调用子类的,子类没有就调用继承自父类的方法,但调用变量时都是调用的父类的
回复 使用道具 举报
弘一 中级黑马 2013-12-20 10:20:28
9#
多态中的成员特点:
                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");
        }
}

评分

参与人数 1技术分 +1 收起 理由
乔兵 + 1

查看全部评分

回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马