论坛首页 Java企业应用论坛

从这个例子你可以想到JAVA多态的什么特性?

浏览 17846 次
精华帖 (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!!
0 请登录后投票
   发表时间:2010-05-28  
liuzhiqiangruc 写道
我是这么理解的:

po=new Child();
po.doSports(HashMap);

由于父类和子类的参数类型不一样,因此他们是两个不同的方法。

因此po.doSports()只作父类中定义的行为,与子类没关系,子类相当于有两个doSports方法。

问题是现在对象签名是po即父类,按理说之类的doSports方法才是最精确的匹配,但是父类签名的对象根本不知道那个最精却匹配的方法的存在。因此只调用了父类的方法。

因为HashMap implements Map因此这个调用是符合父类签名的方法的。因此会调用父类方法。因此,我认为这不是多态。

至于LZ说的静态多态于动态多态的可能我基础理解的不到位吧。

把重载说成静态多态?覆盖说成是动态重载?

我觉得有点炒作概念的嫌疑。



没办法,面试的人就是老大.很多时候,面试不在于出什么题,而在于面试你的人. 所以,我觉得,很多时候是撞运气.特别是面试比较高级的职位时,更是如此. 其实LZ,后面的回复还是有道理的,要比我上次去面试,那个人非得要我讲出多态的两个特性要好多了,还说大学课本上讲过的. 我最后才整明白,他是想让我说:重载是编译时多态,重写是运行时多态.


0 请登录后投票
   发表时间:2010-05-28  
hellolaojiang 写道
liuzhiqiangruc 写道
我是这么理解的:

po=new Child();
po.doSports(HashMap);

由于父类和子类的参数类型不一样,因此他们是两个不同的方法。

因此po.doSports()只作父类中定义的行为,与子类没关系,子类相当于有两个doSports方法。

问题是现在对象签名是po即父类,按理说之类的doSports方法才是最精确的匹配,但是父类签名的对象根本不知道那个最精却匹配的方法的存在。因此只调用了父类的方法。

因为HashMap implements Map因此这个调用是符合父类签名的方法的。因此会调用父类方法。因此,我认为这不是多态。

至于LZ说的静态多态于动态多态的可能我基础理解的不到位吧。

把重载说成静态多态?覆盖说成是动态重载?

我觉得有点炒作概念的嫌疑。



没办法,面试的人就是老大.很多时候,面试不在于出什么题,而在于面试你的人. 所以,我觉得,很多时候是撞运气.特别是面试比较高级的职位时,更是如此. 其实LZ,后面的回复还是有道理的,要比我上次去面试,那个人非得要我讲出多态的两个特性要好多了,还说大学课本上讲过的. 我最后才整明白,他是想让我说:重载是编译时多态,重写是运行时多态.



很感谢hellolaojiang的分享心得~~
0 请登录后投票
   发表时间:2010-05-31  
1. Java中除了static和final方法外,当在派生类中重写基类中static、final、或private方法时,实质上是创建了一个新的方法。

2.在派生类中,对于基类中的private方法,最好采用不同的名字。

3.对象清理的顺序和创建的顺序相反,当然前提是自己想手动清理对象,因为大家都知道Java垃圾回收器。

4.在基类的构造方法中小心调用基类中被重写的方法,这里涉及到对象初始化顺序。

5.构造方法是被隐式声明为static方法。

6.用继承表达行为间的差异,用字段表达状态上的变化。
0 请登录后投票
   发表时间: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;
  * 执行子类还是父类定义的方法?
  子类的。在运行时期,将根据父对象引用的具体自对象的实际的类型来获取对应的方法。所以才有多态性。一个基类的对象引用,被赋予不同的子类对象引用,执行该方法时,将表现出不同的行为。
0 请登录后投票
   发表时间: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);   
    }      

0 请登录后投票
   发表时间: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) 
0 请登录后投票
   发表时间:2010-12-30  
java有个特点。。。就是不能自动向下转型
Object o = new AnyClass();
//这时候,只能调用Object的方法(包含Override的方法),AnyClass的其他方法都不能调用
0 请登录后投票
   发表时间:2010-12-30   最后修改:2010-12-30
这样的重载确实很华丽!
0 请登录后投票
   发表时间:2010-12-30  
Override时,子类方法参数不能放大父类方法参数的范围,子类方法返回值不能缩小父类方法的返回值返回。这本来就是显而易见的道理。
0 请登录后投票
论坛首页 Java企业应用版

跳转论坛:
Global site tag (gtag.js) - Google Analytics