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

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

刘一锋 发表于 2011-10-10 01:35
我发错了,是这句话  成员函数在多态调(覆盖)时,编译看左边,运行看右边。怎么理解呢,这就是没写代码的 ...

class Father
{
        void Met1(){}
        void Met3()
        {
                System.out.println("father");
        }
}

class Sun extends Father
{
        void Met2(){}
        void Met3()
        {
                System.out.println("sun");
        }
}

class Text
{
        public static void main(String [] args)
        {
                Father z1 = new Sun();
                /*
                z1.Met2();
                这一条是不会通过的,因为编译要看父类的方法,
                就是编译看左边,而Met2是在子类中的。
                */
                z1.Met1();
                z1.Met3();
                //这两条是可以通过的,因为都是在左边(父类)当中。
                //运行看右边
                //就是运行打印出来结果方法打印出来的是子类的结果。
                //比如Met3方法父类,子类中都有了,子类把父类覆盖了,所以运行时看子类的,就是所谓的运行看右边。
        }
}

评分

参与人数 1技术分 +3 黑马币 +12 收起 理由
wangfayin + 3 + 12 很给力!

查看全部评分

回复 使用道具 举报
在多态中,成员函数的特点,在编译时期,参阅引用型变量所属的类中是否有调用的方法,如果有,编译通过,如果没有,编译失败

8 个回复

倒序浏览
我发错了,是这句话  成员函数在多态调(覆盖)时,编译看左边,运行看右边。怎么理解呢,这就是没写代码的后果啊,
回复 使用道具 举报
在编译时编译器先看父类中有没有这个方法,如果有就使用父类中的方法,这就是所谓的“看左边”。当在运行期间由于你实际上使用的是父类中的方法,所以这是就会调用子类中的方法,这就是所谓的”看右边“。
回复 使用道具 举报
借用上面的代码,,
Father z1 = new Sun();   //  通过父类生成子类,编译期的类型就是父类类型,运行期是子类类型,
调用z1的方法时,,注意,必须调用 父类存在的方法(子类会继承父类的方法,当然方法名相同会重写),
如果只调用子类存在的方法(是子类中的一个新方法,父类中没有的),那么在 编译期是不能通过的。

评分

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

查看全部评分

回复 使用道具 举报
1. 你说的多态是父类类型引用子类对象的情况。

2. 现在假设父类中有方法A,B,C. 子类继承父类后自己又弄了个方法D,子类就相当于有4个方法了,ABCD。

3. Parent  p= new Child(); 之后,我来个p.D(); 编译器比较傻,他就认为,啊,p是Parent类型的变量,那我看看Parent里有没有D方法,一看没有,编译器就火了,你就一堆红字了。这就是所谓编译看左边。

4. 现在我来个,p.A(); 编译器一看,没问题,光荣下岗了。剩下的都交给新一代(new)的运行来处理,运行的特点就是找新的,不要老得。结果运行一看,你这new的是Child();啊,得我运行Child里的A去。这就是所谓的运行看右边~~~

评分

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

查看全部评分

回复 使用道具 举报
余志强 黑马帝 2011-10-10 19:06:30
7#
Java引用变量有两种类型,一种是编译时类型,一个是运行时类型,编译时类型由声明改变量时使用的类型,也就是你说的编译看左边的原因; 运行时类型是由实际赋给改变量的对象决定的,也就是你所说的运行看右边的道理!如果编译时类型和运行时类型不一致就会出现所谓的多态;

评分

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

查看全部评分

回复 使用道具 举报
郭学文 黑马帝 2011-10-11 12:18:28
8#
其实都是看左边  只是运行时是运行了被右边覆盖了的左边方法  左边没有的方法再运行看右边也是没用的
回复 使用道具 举报
刘浩 黑马帝 2011-10-11 14:50:05
9#
成员函数:
    编译时期:查看的引用雷变量所属的类中是否有被调用的方法。有 编译通过  没有,失败。
   
    运用时期:查看的时对象所属的类中是否有该方法。

照成这种现象的原因:函数在父类的一个特性;覆盖。
所以“,编译看左边,运行看右边”

评分

参与人数 1黑马币 +4 收起 理由
wangfayin + 4

查看全部评分

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