黑马程序员技术交流社区

标题: 谁能给我解释一下这句话的意思,最好有代码!谢谢了 [打印本页]

作者: 刘一锋    时间: 2011-10-10 01:30
标题: 谁能给我解释一下这句话的意思,最好有代码!谢谢了
在多态中,成员函数的特点,在编译时期,参阅引用型变量所属的类中是否有调用的方法,如果有,编译通过,如果没有,编译失败
作者: 刘一锋    时间: 2011-10-10 01:35
我发错了,是这句话  成员函数在多态调(覆盖)时,编译看左边,运行看右边。怎么理解呢,这就是没写代码的后果啊,
作者: 王家俊    时间: 2011-10-10 02:19
在编译时编译器先看父类中有没有这个方法,如果有就使用父类中的方法,这就是所谓的“看左边”。当在运行期间由于你实际上使用的是父类中的方法,所以这是就会调用子类中的方法,这就是所谓的”看右边“。
作者: 李印东老师    时间: 2011-10-10 09:39
刘一锋 发表于 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方法父类,子类中都有了,子类把父类覆盖了,所以运行时看子类的,就是所谓的运行看右边。
        }
}
作者: 石宗银    时间: 2011-10-10 10:16
借用上面的代码,,
Father z1 = new Sun();   //  通过父类生成子类,编译期的类型就是父类类型,运行期是子类类型,
调用z1的方法时,,注意,必须调用 父类存在的方法(子类会继承父类的方法,当然方法名相同会重写),
如果只调用子类存在的方法(是子类中的一个新方法,父类中没有的),那么在 编译期是不能通过的。

作者: 张洋铭    时间: 2011-10-10 18:52
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去。这就是所谓的运行看右边~~~
作者: 余志强    时间: 2011-10-10 19:06
Java引用变量有两种类型,一种是编译时类型,一个是运行时类型,编译时类型由声明改变量时使用的类型,也就是你说的编译看左边的原因; 运行时类型是由实际赋给改变量的对象决定的,也就是你所说的运行看右边的道理!如果编译时类型和运行时类型不一致就会出现所谓的多态;
作者: 郭学文    时间: 2011-10-11 12:18
其实都是看左边  只是运行时是运行了被右边覆盖了的左边方法  左边没有的方法再运行看右边也是没用的
作者: 刘浩    时间: 2011-10-11 14:50
成员函数:
    编译时期:查看的引用雷变量所属的类中是否有被调用的方法。有 编译通过  没有,失败。
   
    运用时期:查看的时对象所属的类中是否有该方法。

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





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