精华帖 (0) :: 良好帖 (10) :: 新手帖 (6) :: 隐藏帖 (7)
|
|
---|---|
作者 | 正文 |
发表时间:2010-05-25
crazy.j 写道 raito_yagami 写道 # po = new ChildObj();
# po.doSport(map); 这个结果为什么是父类的? 你是用父类的定义去调用的方法,如果说把父类的doSport方法换成不属于Map集合的实现类,是无法通过编译的。如果不是这样,当继承关系比较复杂,程序基本没法调试。 这种问题,编译器首先要确保安全性。 首先谢谢你啊。你说的我也知道啊,但是没说出我的疑问啊。 看个简单的 public class P{ public void test(long i){ System.out.println("P"); } public static void main(String [] args){ P p = new C(); p.test(3); } } class C extends P{ public void test(int i){ System.out.println("C"); } } 为什么父类方法的参数类型是long时,调的是父类的方法,而父类的方法为int时,调用的是子类的呢? 我记得以前学的时候就只是知道后面一种情况,前面一种还真没想过。 我刚查了一下,说java的方法绑定是后绑定,依靠一种机制在运行时判断类型,也没说清楚到底是什么机制,所以我还是不明白。 |
|
返回顶楼 | |
发表时间:2010-05-26
最后修改:2010-05-26
maozj 写道 刘琛颖 写道 和多态有什么关系?你这个例子完全就是在讲继承嘛。文不对题!!!
ParentObj po = new ParentObj(); ArrayList list = new ArrayList(); po.doWork(list); po = new ChildObj(); po.doWork(list); ChildObj co = new ChildObj(); co.doWork(list); 子对象赋予父对象,方法调用。。。。仔细看看java的多态 子对象赋予父对象?什么意思?不明白。你要说的就是父类引用指向子类对象吧 请你再次确定真的有多态存在?多态要满足3个要素 1.父类引用指向子类对象 2.方法的覆盖 3.继承 例子中有override? |
|
返回顶楼 | |
发表时间:2010-05-26
最后修改:2010-05-26
raito_yagami 写道 crazy.j 写道 raito_yagami 写道 # po = new ChildObj();
# po.doSport(map); 这个结果为什么是父类的? 你是用父类的定义去调用的方法,如果说把父类的doSport方法换成不属于Map集合的实现类,是无法通过编译的。如果不是这样,当继承关系比较复杂,程序基本没法调试。 这种问题,编译器首先要确保安全性。 首先谢谢你啊。你说的我也知道啊,但是没说出我的疑问啊。 看个简单的 public class P{ public void test(long i){ System.out.println("P"); } public static void main(String [] args){ P p = new C(); p.test(3); } } class C extends P{ public void test(int i){ System.out.println("C"); } } 为什么父类方法的参数类型是long时,调的是父类的方法,而父类的方法为int时,调用的是子类的呢? 我记得以前学的时候就只是知道后面一种情况,前面一种还真没想过。 我刚查了一下,说java的方法绑定是后绑定,依靠一种机制在运行时判断类型,也没说清楚到底是什么机制,所以我还是不明白。 你真是讨厌,整那么多行话干啥! 方法名,参数类型,参数个数一致,发生重写,父类方法被子类覆盖,这时无论是C还是P都只有一个方法。 方法名相同,参数类型或个数不同时候,发生重载,P类有一个方法,C类有2个方法,方法调用的指定通过编译期类型,不通过运行时实例。 |
|
返回顶楼 | |
发表时间:2010-05-26
刘琛颖 写道 maozj 写道 刘琛颖 写道 和多态有什么关系?你这个例子完全就是在讲继承嘛。文不对题!!!
ParentObj po = new ParentObj(); ArrayList list = new ArrayList(); po.doWork(list); po = new ChildObj(); po.doWork(list); ChildObj co = new ChildObj(); co.doWork(list); 子对象赋予父对象,方法调用。。。。仔细看看java的多态 子对象赋予父对象?什么意思?不明白。你要说的就是父类引用指向子类对象吧 请你再次确定真的有多态存在?多态要满足3个要素 1.父类引用指向子类对象 2.方法的覆盖 3.继承 例子中有override? 您看这两句代码: po = new ChildObj(); po.doSport(map); 您会觉得输出结果是什么?可否解释一下呢 |
|
返回顶楼 | |
发表时间:2010-05-26
crazy.j 写道 raito_yagami 写道 crazy.j 写道 raito_yagami 写道 # po = new ChildObj();
# po.doSport(map); 这个结果为什么是父类的? 你是用父类的定义去调用的方法,如果说把父类的doSport方法换成不属于Map集合的实现类,是无法通过编译的。如果不是这样,当继承关系比较复杂,程序基本没法调试。 这种问题,编译器首先要确保安全性。 首先谢谢你啊。你说的我也知道啊,但是没说出我的疑问啊。 看个简单的 public class P{ public void test(long i){ System.out.println("P"); } public static void main(String [] args){ P p = new C(); p.test(3); } } class C extends P{ public void test(int i){ System.out.println("C"); } } 为什么父类方法的参数类型是long时,调的是父类的方法,而父类的方法为int时,调用的是子类的呢? 我记得以前学的时候就只是知道后面一种情况,前面一种还真没想过。 我刚查了一下,说java的方法绑定是后绑定,依靠一种机制在运行时判断类型,也没说清楚到底是什么机制,所以我还是不明白。 你真是讨厌,整那么多行话干啥! 方法名,参数类型,参数个数一致,发生重写,父类方法被子类覆盖,这时无论是C还是P都只有一个方法。 方法名相同,参数类型或个数不同时候,发生重载,P类有一个方法,C类有2个方法,方法调用的指定通过编译期类型,不通过运行时实例。 这问仁兄说的很好,简单的补充一下,首先得判断是重写还是重载. 当参数为long类型时,这里就是overload,而overload是在编译时刻就决定了的,所以要看引用类型而不是对象类型,引用类型决定了调用哪个版本的重载方法; 当为int时,这里就是override. override是在运行时决定调用哪个版本的方法. LZ的test2方法也就是这个意思. |
|
返回顶楼 | |
发表时间:2010-05-26
最后修改:2010-05-26
其实问题并不复杂,如果大家看仔细,我很想说,它很简单,只是看你细不细心。
首先,要明确,Child对Parent发生了方法的Overload而不是override,原因是参数类型不同。 接下来,再观察执行时的参数类型,分别是ArrayList和HashMap. 最后,再看调用对象的声明类型和实例类型,由于是Overload,所以Child的实例类型中实际上有4个方法,而不是2个,这个时候掉哪个完全看参数的匹配情况。 |
|
返回顶楼 | |
发表时间:2010-05-26
linliangyi2007 写道 其实问题并不复杂,如果大家看仔细,我很想说,它很简单,只是看你细不细心。
首先,要明确,Child对Parent发生了方法的Overload而不是override,原因是参数类型不同。 接下来,再观察执行时的参数类型,分别是ArrayList和HashMap. 最后,再看调用对象的声明类型和实例类型,由于是Overload,所以Child的实例类型中实际上有4个方法,而不是2个,这个时候掉哪个完全看参数的匹配情况。 该楼层 讲的很不错 分析的也很仔细 这是基础中最最重要的态度 |
|
返回顶楼 | |
发表时间:2010-05-26
1. Java的多态性总结:
(1) 首先, 要明确Child对Parent发生了方法的overload还是overwrite,根据参数类型及个数。 (2) 如果是overload,则Child继承了Parent的方法,相当于Child多加了父类的方法。 (3) 如果是overwrite, 则Child类不会有父类的该方法,而是把该方法重写了,所以该方法存在于父类中,子类只是重写了。要想调用父类的该方法,只能通过super关键字调用。 java 的这种机制遵循一个原则:当超类对象引用变量引用子类对象时,被引用对象的类型而不是引用变量的类型决定了调用谁的成员方法,但是这个被调用的方法必须是在超类中定义过的,也就是说被子类覆盖的方法。 (4) 接下来,观察方法执行时的参数类型; (5) 然后看调用对象的声明类型和实例类型; (6) 方法的调度采用最精确参数匹配。 2. 多态分两种: (1) 编译时多态:编译时动态重载; (2) 运行时多态:指一个对象可以具有多个类型,方法的覆盖 这样对于对象而言分为: 理解运行时多态: Car c = new Bus(); Car编译时类型 编译时检查变量类型是否存在,是否有调用的方法。 Bus运行时类型 实际运行是访问heap中的对象,调用实际的方法。 运行时多态是由运行时类型决定的 编译时多态是由编译时类型决定的 |
|
返回顶楼 | |
发表时间:2010-05-26
maozj 写道 1. Java的多态性总结:
(1) 首先, 要明确Child对Parent发生了方法的overload还是overwrite,根据参数类型及个数。 (2) 如果是overload,则Child继承了Parent的方法,相当于Child多加了父类的方法。 (3) 如果是overwrite, 则Child类不会有父类的该方法,而是把该方法重写了,所以该方法存在于父类中,子类只是重写了。要想调用父类的该方法,只能通过super关键字调用。 java 的这种机制遵循一个原则:当超类对象引用变量引用子类对象时,被引用对象的类型而不是引用变量的类型决定了调用谁的成员方法,但是这个被调用的方法必须是在超类中定义过的,也就是说被子类覆盖的方法。 (4) 接下来,观察方法执行时的参数类型; (5) 然后看调用对象的声明类型和实例类型; (6) 方法的调度采用最精确参数匹配。 2. 多态分两种: (1) 编译时多态:编译时动态重载; (2) 运行时多态:指一个对象可以具有多个类型,方法的覆盖 这样对于对象而言分为: 理解运行时多态: Car c = new Bus(); Car编译时类型 编译时检查变量类型是否存在,是否有调用的方法。 Bus运行时类型 实际运行是访问heap中的对象,调用实际的方法。 运行时多态是由运行时类型决定的 编译时多态是由编译时类型决定的 这里的运行期跟编译期的区分很犀利,顶 |
|
返回顶楼 | |
发表时间:2010-05-27
感觉这根本就不是多态啊,参数类型不一致。各用各的,没问题的阿
|
|
返回顶楼 | |