精华帖 (0) :: 良好帖 (10) :: 新手帖 (6) :: 隐藏帖 (7)
|
|
---|---|
作者 | 正文 |
发表时间:2010-05-28
liuzhiqiangruc 写道 我是这么理解的:
po=new Child(); po.doSports(HashMap); 由于父类和子类的参数类型不一样,因此他们是两个不同的方法。 因此po.doSports()只作父类中定义的行为,与子类没关系,子类相当于有两个doSports方法。 问题是现在对象签名是po即父类,按理说之类的doSports方法才是最精确的匹配,但是父类签名的对象根本不知道那个最精却匹配的方法的存在。因此只调用了父类的方法。 因为HashMap implements Map因此这个调用是符合父类签名的方法的。因此会调用父类方法。因此,我认为这不是多态。 至于LZ说的静态多态于动态多态的可能我基础理解的不到位吧。 把重载说成静态多态?覆盖说成是动态重载? 我觉得有点炒作概念的嫌疑。 讲的很中庸 欣然接受... you good!! |
|
返回顶楼 | |
发表时间:2010-05-28
liuzhiqiangruc 写道 我是这么理解的:
po=new Child(); po.doSports(HashMap); 由于父类和子类的参数类型不一样,因此他们是两个不同的方法。 因此po.doSports()只作父类中定义的行为,与子类没关系,子类相当于有两个doSports方法。 问题是现在对象签名是po即父类,按理说之类的doSports方法才是最精确的匹配,但是父类签名的对象根本不知道那个最精却匹配的方法的存在。因此只调用了父类的方法。 因为HashMap implements Map因此这个调用是符合父类签名的方法的。因此会调用父类方法。因此,我认为这不是多态。 至于LZ说的静态多态于动态多态的可能我基础理解的不到位吧。 把重载说成静态多态?覆盖说成是动态重载? 我觉得有点炒作概念的嫌疑。 没办法,面试的人就是老大.很多时候,面试不在于出什么题,而在于面试你的人. 所以,我觉得,很多时候是撞运气.特别是面试比较高级的职位时,更是如此. 其实LZ,后面的回复还是有道理的,要比我上次去面试,那个人非得要我讲出多态的两个特性要好多了,还说大学课本上讲过的. 我最后才整明白,他是想让我说:重载是编译时多态,重写是运行时多态. |
|
返回顶楼 | |
发表时间:2010-05-28
hellolaojiang 写道 liuzhiqiangruc 写道 我是这么理解的:
po=new Child(); po.doSports(HashMap); 由于父类和子类的参数类型不一样,因此他们是两个不同的方法。 因此po.doSports()只作父类中定义的行为,与子类没关系,子类相当于有两个doSports方法。 问题是现在对象签名是po即父类,按理说之类的doSports方法才是最精确的匹配,但是父类签名的对象根本不知道那个最精却匹配的方法的存在。因此只调用了父类的方法。 因为HashMap implements Map因此这个调用是符合父类签名的方法的。因此会调用父类方法。因此,我认为这不是多态。 至于LZ说的静态多态于动态多态的可能我基础理解的不到位吧。 把重载说成静态多态?覆盖说成是动态重载? 我觉得有点炒作概念的嫌疑。 没办法,面试的人就是老大.很多时候,面试不在于出什么题,而在于面试你的人. 所以,我觉得,很多时候是撞运气.特别是面试比较高级的职位时,更是如此. 其实LZ,后面的回复还是有道理的,要比我上次去面试,那个人非得要我讲出多态的两个特性要好多了,还说大学课本上讲过的. 我最后才整明白,他是想让我说:重载是编译时多态,重写是运行时多态. 很感谢hellolaojiang的分享心得~~ |
|
返回顶楼 | |
发表时间:2010-05-31
1. Java中除了static和final方法外,当在派生类中重写基类中static、final、或private方法时,实质上是创建了一个新的方法。
2.在派生类中,对于基类中的private方法,最好采用不同的名字。 3.对象清理的顺序和创建的顺序相反,当然前提是自己想手动清理对象,因为大家都知道Java垃圾回收器。 4.在基类的构造方法中小心调用基类中被重写的方法,这里涉及到对象初始化顺序。 5.构造方法是被隐式声明为static方法。 6.用继承表达行为间的差异,用字段表达状态上的变化。 |
|
返回顶楼 | |
发表时间:2010-05-31
多态性:发送消息给某个对象,让该对象自行决定响应何种行为。
通过将子类对象引用赋值给超类对象引用变量来实现动态方法调用。 The Java Virtual Machine does not require any particular internal structure for objects. In Sun's current implementation of the Java Virtual Machine, a reference to a class instance is a pointer to a handle that is itself a pair of pointers: one to a table containing the methods of the object and a pointer to the Class object that represents the type of the object, and the other to the memory allocated from the Java heap for the object data. (jvm规范中关于对象内存布局的说明) * 为什么子类的类型的对象实例可以覆给超类引用? 自动实现向上转型。通过该语句,编译器自动将子类实例向上移动,成为通用类型BaseClass; * 执行子类还是父类定义的方法? 子类的。在运行时期,将根据父对象引用的具体自对象的实际的类型来获取对应的方法。所以才有多态性。一个基类的对象引用,被赋予不同的子类对象引用,执行该方法时,将表现出不同的行为。 |
|
返回顶楼 | |
发表时间:2010-12-29
zhxing 写道 java 一般会先找完全匹配的类型,然后再找一些继承的类型。。可以看下thinking in java ,里面有说。
public static void test2(){ ParentObj po = new ParentObj(); HashMap map = new HashMap(); po.doSport(map); po = new ChildObj(); //为什么这个地方匹配的是父类的方法,而不是精确的匹配子类的方法! po.doSport(map); ChildObj co = new ChildObj(); co.doSport(map); } |
|
返回顶楼 | |
发表时间:2010-12-30
子类两个方法都重载了, ParentObj po = new ParentObj();
ArrayList list = new ArrayList(); po.doWork(list);//po为父类调用doWork(ArrayList list) po = new ChildObj(); po.doWork(list);//po为子类调用doWork(ArrayList list) ChildObj co = new ChildObj(); co.doWork(list);//po为子类调用doWork(ArrayList list) ParentObj po = new ParentObj(); HashMap map = new HashMap(); po.doSport(map);//po为父类调用doSport(Map map) po = new ChildObj(); po.doSport(map);//po为子类调用doSport(Map map)其中map强转成Map类型 ChildObj co = new ChildObj(); co.doSport(map);//po为子类调用doSport(HashMap map) |
|
返回顶楼 | |
发表时间:2010-12-30
java有个特点。。。就是不能自动向下转型
Object o = new AnyClass(); //这时候,只能调用Object的方法(包含Override的方法),AnyClass的其他方法都不能调用 |
|
返回顶楼 | |
发表时间:2010-12-30
最后修改:2010-12-30
这样的重载确实很华丽!
|
|
返回顶楼 | |
发表时间:2010-12-30
Override时,子类方法参数不能放大父类方法参数的范围,子类方法返回值不能缩小父类方法的返回值返回。这本来就是显而易见的道理。
|
|
返回顶楼 | |