论坛首页 Java企业应用论坛

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

浏览 17851 次
精华帖 (0) :: 良好帖 (10) :: 新手帖 (6) :: 隐藏帖 (7)
作者 正文
   发表时间:2010-05-27  
感谢楼主和大家的回复,我感觉还是楼主的好懂点。
0 请登录后投票
   发表时间:2010-05-27  
po = new ChildObj(); 
po.doSport(map);
这个结果为什么是父类的?

对这个问题的分析,有待验证。。。 虽然各楼层有分析,但不够全面。。。
0 请登录后投票
   发表时间:2010-05-27  
liuzhiqiangruc 写道
感觉这根本就不是多态啊,参数类型不一致。各用各的,没问题的阿

你对java多态的理解是什么呢?
0 请登录后投票
   发表时间:2010-05-27  
maozj 写道
liuzhiqiangruc 写道
感觉这根本就不是多态啊,参数类型不一致。各用各的,没问题的阿

你对java多态的理解是什么呢?

父类和子类的函数签名不完全一样,所以不构成多态的基本条件。这可能就是po=new Child();po.doSports();是父类的结果的原因吧。请指教。
0 请登录后投票
   发表时间:2010-05-27  
liuzhiqiangruc 写道
maozj 写道
liuzhiqiangruc 写道
感觉这根本就不是多态啊,参数类型不一致。各用各的,没问题的阿

你对java多态的理解是什么呢?

父类和子类的函数签名不完全一样,所以不构成多态的基本条件。这可能就是po=new Child();po.doSports();是父类的结果的原因吧。请指教。

1.关于java的多态,它讲java的多态分成静态的多态,和动态的多态,而所谓静态的多态就是只函数的重载,动态的多态就是方法的覆写。

2.静态的多态性。系统会在你编译的时候根据你调用的方法的参数列表来动态的决定调用那一个函数。

3.还有一种多态性:动态多态性。Java实现运行时多态性的基础是动态方法调度,它是一种在运行时而不是在编译期调用重载方法的机制。动态性多态的例子,比如说"一个接口,多个方法"。

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中的对象,调用实际的方法。
    运行时多态是由运行时类型决定的
    编译时多态是由编译时类型决定的
0 请登录后投票
   发表时间:2010-05-27  
liuzhiqiangruc 写道
maozj 写道
liuzhiqiangruc 写道
感觉这根本就不是多态啊,参数类型不一致。各用各的,没问题的阿

你对java多态的理解是什么呢?

父类和子类的函数签名不完全一样,所以不构成多态的基本条件。这可能就是po=new Child();po.doSports();是父类的结果的原因吧。请指教。

对重载和覆盖 明白吗
0 请登录后投票
   发表时间:2010-05-27  
po = new ChildObj(); 
po.doSport(map);
这个结果为什么是父类的?

java 的这种机制遵循一个原则:当超类对象引用变量引用子类对象时,被引用对象的类型而不是引用变量的类型决定了调用谁的成员方法,但是这个被调用的方法必须是在超类中定义过的,也就是说被子类覆盖的方法。

如果没有覆盖,就会遵循编译时多态:编译时动态重载;既调用了父类的方法!
0 请登录后投票
   发表时间:2010-05-27  
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、父类引用指向子类对象。

我请问哪里符合第二条了,参数类型一样吗?
0 请登录后投票
   发表时间:2010-05-27  
maozj 写道
linliangyi2007 写道
其实问题并不复杂,如果大家看仔细,我很想说,它很简单,只是看你细不细心。

首先,要明确,Child对Parent发生了方法的Overload而不是override,原因是参数类型不同。

接下来,再观察执行时的参数类型,分别是ArrayList和HashMap.

最后,再看调用对象的声明类型和实例类型,由于是Overload,所以Child的实例类型中实际上有4个方法,而不是2个,这个时候掉哪个完全看参数的匹配情况。

该楼层 讲的很不错 分析的也很仔细 这是基础中最最重要的态度

总结的很精准
0 请登录后投票
   发表时间:2010-05-27  
我是这么理解的:

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

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

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

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

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

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

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

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

0 请登录后投票
论坛首页 Java企业应用版

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