黑马程序员技术交流社区
标题:
谁能给我解释一下这句话的意思,最好有代码!谢谢了
[打印本页]
作者:
刘一锋
时间:
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