黑马程序员技术交流社区
标题: 关于多态中成员函数 [打印本页]
作者: hg3093483 时间: 2013-3-21 17:37
标题: 关于多态中成员函数
本帖最后由 hg3093483 于 2013-3-22 17:43 编辑
看到毕老师的视频里,有说到,成员函数在多态调用时,编译看左边,运行看右边,小弟不理解,请给详细说明一下,谢谢啦
作者: 我手心里的宝 时间: 2013-3-21 17:46
编译看左边:例
Person person=new Student();这样编译时没有错的 多态可以简单理解为父类对象可以指向子类对象
如果你左边是跟Student 一样继承Person的类编译就会出错
不好意思,上面是我的一点回忆
编译看左边就是如果父类没有子类的方法就会报错
运行的时候运行的是右边子类的方法 所以运行看右边
作者: 李阳阳 时间: 2013-3-21 17:49
本帖最后由 李阳阳 于 2013-3-21 17:57 编辑
这是我当时的练习你看下,希望对你有帮助、- /*
- 多态中成员函数的特点:编译看左边运行看右边 如例一;
- 成员变量的特点:无论编译还是运行都看左边 如例二;
- 静态成员函数的特点:编译或运行都看左边 如例三;
- */
- class Fu
- {
- int num = 5;
- void show1()
- {
- System.out.println("Fu show_1");
- }
- void show2()
- {
- System.out.println("Fu show_2");
- }
- static void show4()
- {
- System.out.println("Fu show_4");
- }
- }
- class Zi extends Fu
- {
- int num = 8;
- int x=3;
- void show1()
- {
- System.out.println("Zi show_1");
- }
- void show3()
- {
- System.out.println("Zi show_3");
- }
- static void show4()
- {
- System.out.println("Zi show_4");
- }
- static void show5()
- {
- System.out.println("Zi show_5");
- }
- }
- class DuoTaiTeDian
- {
-
- public static void main(String[] args)
- {
- Fu f = new Zi();
- //如果是f.Show3();则编译不通过因为父类中没有f.Show3();下面运行结果则是累类中的"Zi show_1";
- f.show1();//例一:
- //如果是f.x则编译不通过,因为看左边父类中无X成员变量;下面运行结果也是5,因为运行也看左边父类中有num=5;
- System.out.println(f.num);//例二
- //因为左边父类中无show5(),所以编译不通过。如果为f.show4(),则打印结果为"Fu show_4";
- f.show5();//例三
- //Zi z = new Zi();
- //System.out.println(z.x);
- }
- }
复制代码
作者: 祁振朋 时间: 2013-3-21 17:49
父类引用指向子类对象在开发中最常见的多态
父类 引用=new 子类();
调用实例方法
前提:查看父类中是否存在该方法
调用:调用的是子类中的重写的方法。
调用实例属性:
前提:父类中是否存在属性
调用:父类中的属性。
类属性:
前提:查看父类中是否存在该属性
调用: 调用的是父类中的类属性
类方法:
前提:查看父类中是否存在该属性
调用: 调用的是父类中的类方法
所以,调用成员方法时,编译的时候看左边父类是否存在该方法,运行的时候实际调用的是子类的,重写的方法。也就是右边
作者: 陈原野 时间: 2013-3-21 17:58
Animal c = new Cat(); 左边是 Animal 类(或接口) 右边是 Cat()类; 在编译的时候编译器不管你右边是什么类,只要左边的Animal类(或接口)能编译通过就不会报错。但是运行的时候就要按照右边的Cat()类实际情况来运行。
从这里来看.编译的时候就是验证Animal是否有这个接口,(左边)
运行的时候 a实际上是Cat.(Cat 是 Animald的实现类)
实际是要运行Cat的实现方法.(右边)
作者: 陈原野 时间: 2013-3-21 17:58
Animal c = new Cat(); 左边是 Animal 类(或接口) 右边是 Cat()类; 在编译的时候编译器不管你右边是什么类,只要左边的Animal类(或接口)能编译通过就不会报错。但是运行的时候就要按照右边的Cat()类实际情况来运行。
从这里来看.编译的时候就是验证Animal是否有这个接口,(左边)
运行的时候 a实际上是Cat.(Cat 是 Animald的实现类)
实际是要运行Cat的实现方法.(右边)
作者: 于腾飛 时间: 2013-3-21 18:04
在多态中非静态成员函数的特点:
在编译时期:参阅引用型变量中是否有调用的方法,有则编译通过,没有则编译失败。
在运行时期:参阅对象所属的类中是否有调用的方法。
简单总结就是:非静态成员函数在多态调用时,编译看左边,运行看右边。
编译时只是检查语法。
如class fu(){方法一} class zi(){zi方法一;方法二}父子之间是继承关系,
此时你 new fu f=new zi();编译时 会发现 fu里有方法一和zi里一致,可以调用,运行时,看zi类中的调用方法有一,有二,此时你调用方法一是没问题的,调用方法二,因为fu中没有相应的方法,所以调用二时会报错,所以运行时要看右边
欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/) |
黑马程序员IT技术论坛 X3.2 |