论坛首页 Java企业应用论坛

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

浏览 17853 次
精华帖 (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的方法绑定是后绑定,依靠一种机制在运行时判断类型,也没说清楚到底是什么机制,所以我还是不明白。
0 请登录后投票
   发表时间: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?
0 请登录后投票
   发表时间: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个方法,方法调用的指定通过编译期类型,不通过运行时实例。
0 请登录后投票
   发表时间: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);  

您会觉得输出结果是什么?可否解释一下呢
0 请登录后投票
   发表时间: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方法也就是这个意思.

0 请登录后投票
   发表时间:2010-05-26   最后修改:2010-05-26
其实问题并不复杂,如果大家看仔细,我很想说,它很简单,只是看你细不细心。

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

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

最后,再看调用对象的声明类型和实例类型,由于是Overload,所以Child的实例类型中实际上有4个方法,而不是2个,这个时候掉哪个完全看参数的匹配情况。
2 请登录后投票
   发表时间:2010-05-26  
linliangyi2007 写道
其实问题并不复杂,如果大家看仔细,我很想说,它很简单,只是看你细不细心。

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

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

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

该楼层 讲的很不错 分析的也很仔细 这是基础中最最重要的态度
0 请登录后投票
   发表时间: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中的对象,调用实际的方法。
    运行时多态是由运行时类型决定的
    编译时多态是由编译时类型决定的
0 请登录后投票
   发表时间: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中的对象,调用实际的方法。
    运行时多态是由运行时类型决定的
    编译时多态是由编译时类型决定的

这里的运行期跟编译期的区分很犀利,顶
0 请登录后投票
   发表时间:2010-05-27  
感觉这根本就不是多态啊,参数类型不一致。各用各的,没问题的阿
0 请登录后投票
论坛首页 Java企业应用版

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