站内搜索: 请输入搜索关键词

当前页面: JAVA 编程资料牛鼻论坛Java & J2SE 技术区→类的多态

类的多态

发表新主题   回复此主题

第1楼 2002-04-04 10:44 nice-person 写道:

类的多态


太高深了, 我只知道
a=b不对
b=a对


第2楼 2013-08-31 12:44 Robot :

类的多态 相关


第3楼 2002-04-04 12:10 yayatu 写道:

类的多态


agree top


第4楼 2002-04-04 15:19 javadevfan 写道:

类的多态


“a=b”为什么不对?
子类不是可以转换成父类吗?
“子类的引用变量同时也具有父类的类型”,我说得对吗?


第5楼 2002-04-04 16:17 ak47 写道:

类的多态


a=b可以。 class X{} class Y extends X{} public class Z { public static void main(String[] args) {       X a=new X();       Y b=new Y();       a=b;//b=a不行. } }

b=a要进行下溯造型。 class X{} class Y extends X{} public class Z { public static void main(String[] args) {       X a=new X();       Y b=new Y();       a=b;       Y b1=new Y();       b1=(Y)a; } } 可以参考下面的例子。

设sun是father的子类 Father xxx =new Sun(); 上溯造型是安全的。接口缩小了。 Sun xxx =new Father(); 下溯造型必须强迫造型,而且父类必须曾经参考到子类。 Father xxx =new Sun(); Sun s=(Sun)xxx; class Father { int i; } public class Sun1 extends Father { Father f=new Sun(); Sun s=(Sun)f; } class Father { int i; } public class Sun2 extends Father { Father f=new Sun(); }


第6楼 2002-08-10 09:47 zhwll 写道:

类的多态


x是y的父类;下面的语句是正确的么??????????????????????????
Y n=new X();



第7楼 2002-08-10 10:44 hiha 写道:

类的多态


上面的错了,可能必须强制类型转换:
Y n=(Y)new X();


第8楼 2002-08-10 11:03 tuhuayuan 写道:

类的多态


子类包含的内容
父类都有
就像long 比int 能有更多地位一样
Casting都是一个道理


第9楼 2002-08-10 12:22 wab 写道:

类的多态


     X a=new X();
     Y b=new Y();
     a=b;  //这句没错,由于将子类对象造型成父类对象,相当做了个隐式造型:a = (X)b;
     Y b1=new Y();
     b1=(Y)a; //但是这句行吗?编译时可能就会得到一个ClassCastException了.



第10楼 2002-08-10 18:38 黯然销魂 写道:

类的多态


编译的时候,好像不会,运行的时候,会抛出错误的。
因为ClassCastException是Runtime Exception.


第11楼 2002-08-11 02:43 suasalito 写道:

类的多态


[这个贴子最后由suasalito在 2002/08/10 12:02pm 编辑]

a=b是对的
a是一个基类的句柄,b是一个衍生类的句柄,a=b这句意味着将句柄b赋给句柄a
更进一步可以说将一个衍生类句柄赋给给其基类句柄,这当然行的通,b会自动上
溯造型为一个基类句柄。(句柄同引用变量一个意思,个人习惯不一)
上溯造型的概念:将从一个衍生类句柄转换成一个基类句柄的行为称为上溯造型
上溯造型是自动完成的



第12楼 2002-08-21 11:46 angla 写道:

类的多态


overloading is not a concept of polymorphism. it is overriding.


第13楼 2002-08-21 14:18 reno 写道:

类的多态


看不懂啊!!!


第14楼 2002-09-22 05:39 freewang 写道:

类的多态


overriding是多态性的概念,即覆盖。overloading是相同的名字具有不同的意义。也叫过载。 如f(int i,String s)和f(Sting s ,int i),就叫方法的过载 。 回到最初的那个问题。 a=b 可以,但如何实现b=a呢 X a=new X(); Y b=new Y(); X a1=b Y b1=(Y)a1; 就实现了强制转换  

请大家指正


第15楼 2002-09-22 06:11 freedom 写道:

类的多态


上边说的一点没有错。
1、上溯造型时,子类可以付给基类;
2、下溯造型时,此句柄一定要是指向子类的句柄;


第16楼 2003-07-17 06:26 西门飞雪 写道:

类的多态


a=b正确。
在java中,所有的对象都只是是一个引用。可以把引用当成一个指针来理解。以c++的观点来看,X a;相当于声明了一个指向X类的指针,指向父类的指针当然可以指向子类,但如果用子类的指针指向父类就不行。就好象一个学生是一个学生类的对象。学生是人,但人不一定就是学生。所以一个人类的指针可以指向它的子类-学生类的对象。但一个子类指针无法指向父类对象。还有一点就是一个父类指针无法访问子类的成员变量。只能访问子类的方法。
    另外,和c++不同之处是,如果X,Y类都存在一个相同的方法  aa,那么在a=b之后 a.aa将调用子类的方法。这是因为在java中父类的方法默认都是虚的。


第17楼 2003-09-23 05:43 baixue2580 写道:

类的多态


经过一番激烈的思想斗争终于弄懂了,真理总是越辩越明,谢谢各位!


第18楼 2003-11-18 11:32 tyson 写道:

类的多态


X是父类,Y是子类
Y应包含父类的所有内容
a=b 是不对


第19楼 2003-11-18 12:00 sukura 写道:

类的多态


同意楼上的说法


第20楼 2003-11-19 05:15 victorlau 写道:

类的多态


刚开始学的时候, 只知道 a = b;可以,而 b = a; 不可以, 但不知道为啥, 现在终于想通了! Thanks!


第21楼 2003-12-04 09:55 tiaozhanzhe 写道:

类的多态


明白了


第22楼 2004-03-10 08:38 腦袋空白 写道:

类的多态


class A { }
class B extends A { }
A a = new B( );


第23楼 2004-03-26 05:41 skernel 写道:

类的多态


终于搞清楚了,谢谢


第24楼 2004-04-04 04:02 yalong 写道:

类的多态


引用"类的多态体现在方法的重载(overload)上,包括成员方法和构造方法的重载。"

好像不是吧,多态性体现在方法的覆盖啊。怎么会是重载呢?我没说错吧。


第25楼 2004-04-04 06:40 flyinsky 写道:

类的多态


我觉得也是呀,多态应该是方法的覆写,不是方法的重载啊。
为什么不试一下上溯和下溯的可能性那?


第26楼 2004-07-13 06:19 sarsfree 写道:

类的多态


我明白了~~~thx


第27楼 2004-07-13 07:06 carcass 写道:

类的多态


汗~~~


第28楼 2005-03-20 17:07 irobot 写道:

Re:类的多态


null


第29楼 2005-03-20 17:11 irobot 写道:

Re:类的多态


null


第30楼 2005-03-26 06:31 irobot 写道:

Re:类的多态


一个对象变量可以指向多种实际类型的现象被称为“多态”。
----- java 核心技术 卷一 P145

可以看出,只有方法的覆盖才能在对象变量可以指向多种实际类型的现象中体现出来。
我以前的理解错了!


第31楼 2005-03-28 11:55 yuleiyfl 写道:

Re:类的多态


什么是上溯,什么是下下溯啊?


第32楼 2005-03-28 16:54 chg850321 写道:

Re:类的多态


多态是体现在方法的重载的,
不是覆盖。
有没有权威的人发言啊,
觉得他们说的不对.............


第33楼 2005-03-29 05:07 irobot 写道:

Re:类的多态


一个对象变量可以指向多种实际类型的现象被称为“多态”。
再好好想想!


第34楼 2005-03-29 06:35 irobot 写道:

Re:类的多态


1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
class{
     ...
     void 说话 ( String word ) { 说word }
     ...
}
class 小孩 extends{
     ...
     void 说话 ( String word ) { 奶声奶气地说 word } //覆盖人的说话方法。
     ...
}    
 
public class Test
{
    ...
    static void 做事( 人  一个人) 
   { 
         String word="多态体现在方法的覆盖上"; 
         一个人.说话 ( word ); 
    }
    ...
    public static void main(String[] args)
    {
          人  干活的= new 小孩();
          /** 
           因为小孩是人的子类,所以指向人的对象的变量(干活的)必然可以
           指向小孩的对象,这就是所谓 的上溯(upcast)。
          */
 
          做事 ( 干活的 );
          /** 
           做事方法需要一个人的对象作为参数,人既然能满足做事方法的要求,
           孩子是人的子类,必然也能满足,这很符合人的逻辑思维。就像做事方法
           说我需要一个人来做这件事,它所着眼的仅仅是人的某种能力,例如“说
           话”。那么即使是一个小孩也是一个人(作为人的子类),因为人所有的共性,
          小孩也都有。小孩也有“说话”这个方法,但其实现却与人的不同,例如小孩
           的“说话”是奶声奶气地说话。这样,当小孩的对象作为一个人的对象被调用
           时,实现的是自己的“说话”方法。
         */ 
     }    
}
 



第35楼 2005-04-03 09:10 miankelin 写道:

Re:类的多态


引用原文:
?X袋空白 wrote:
class A { }
class B extends A { }
A a = new B( );



我觉得这是只看程序而没有注意内存的问题。
A是B 的父类,B是A的子类。在A a=new A(); B b=new B(); a=b; 其实就是内存句柄的引用罢了,把B类转化为父类。
要多点注意内存!!

谢谢指教!!


第36楼 2005-04-03 12:39 午后咖啡 写道:

Re:类的多态


重写Overriding是父类与子类之间多态性的一种表现,
重载Overloading是一个类中多态性的一种表现。
如果在子类中定义某方法与其父类有相同的名称和参数,我们说该方法被重写
(Overriding)。子类的对象使用这个方法时,将调用子类中的定义,对它而言,父类中的定义如同被“屏蔽”了。如果在一个类中定义了多个同名的方法,它们或有不同的参数个数或有不同的参数类型,则称为方法的重载(Overloading)。

刚从资料上看到


第37楼 2005-04-03 13:59 weixin0600 写道:

Re:类的多态


还是不很明白啊overridding和overload区别啊,


第38楼 2005-04-03 14:02 weixin0600 写道:

Re:类的多态


总觉的应该是a=b;才是对的


第39楼 2005-04-03 15:33 爪洼岛 写道:

Re:类的多态


a是超类X对象的引用 b是子类Y对象的引用

a = b是正确的 因为子类对象可以视为超类的对象

这样操作后 a就可以直接调用b的方法bMethod了:a.bMethod()



第40楼 2005-04-07 01:54 suncanto 写道:

Re:类的多态


关于overload 和overriding我的理解如下:
同一个类中的多态体现为overload(重载)
不同类之间的多态体现为overriding(覆写)
请教各位大侠,不知道我的理解对不对?


第41楼 2005-04-07 07:05 irobot 写道:

Re:类的多态


多态体现在不同类间。


第42楼 2005-04-11 06:00 brull 写道:

Re:类的多态


引用原文:
午后咖啡 wrote:
重写Overriding是父类与子类之间多态性的一种表现,
重载Overloading是一个类中多态性的一种表现。
如果在子类中定义某方法与其父类有相同的名称和参数,我们说该方法被重写
(Overriding)。子类的对象使用这个方法时,将调用子类中的定义,对它而言,父类中的定义如同被“屏蔽”了。如果在一个类中定义了多个同名的方法,它们或有不同的参数个数或有不同的参数类型,则称为方法的重载(Overloading)。

刚从资料上看到


说得非常正确,这也是我的理解


第43楼 2005-04-11 07:52 我是java 写道:

Re:类的多态


父类的引用可以指向子类的对象,反之只能通过强制转换。多态就体现在指向子类的父类引用可以调用子类的任何函数,尤其是覆盖的函数。(引用可以理解为指针)


第44楼 2005-04-11 07:55 我是java 写道:

Re:类的多态


覆盖和重载是完全不同的概念。覆盖指的是子类对父类的覆盖。重载是类内部的多态。


第45楼 2005-06-10 04:27 dd112 写道:

Re:类的多态


这个问题是多态的问题,是向上转行,和向下转行的问题。上转是危险,下转是安全的。举个例:
小汽车是车,
车不是小汽车;
等同: new 车= nwe 汽车,
new 汽车= new 车 ;
要是看不懂,我也没办法。我连个java helloworld都写过!
大家多看写书吧!!!


第46楼 2005-06-11 03:48 summertea 写道:

Re:类的多态


好像明白些


第47楼 2005-06-11 07:26 calebhu 写道:

Re:类的多态


多态性应该既体现在方法的覆盖也体现在方法的重载。
以上“类的多态体现在方法的重载(overload)上,包括成员方法和构造方法的重载。”我觉得也是正确的。
不知道对不对,请高手指教。


第48楼 2005-06-12 22:29 cailin 写道:

Re:类的多态


因为子类其实是父类的超集,父类的接口子类都有,而子类的接口父类不一定有。
所以upcast是安全的,这也是多态的表现。
这是我的理解。


第49楼 2005-07-03 17:54 conanjava 写道:

Re:类的多态


a=b是正确的
因为a 是 b 的父类啊,这是父类指针指向子类对象,属于动态绑定,
现实一点,
比如说 a 是人这个类,b 是黄种人这个类,
你就可以说,黄种人是人,却不能说 人是黄种人.
这样说,就好理解一些了!


第50楼 2005-07-03 19:11 fantasydog 写道:

Re:类的多态


厄……多态的概念似乎不是这样的。
1.多态的目的是向后兼容,即你要实现某种新的功能,可以尽可能少的改动原来的代码,或者干脆就不改动。因此通常不是由 a=b这样表现(尽管比较直观),而是通过函数调用的方式。例如:
1
2
3
void method(Base b){
    b.doSomething();
}

之后你觉得要进行某种程度的改动,b原先的定义已经不能满足需要了,你就可以从Base类继承一个类Derive,然后给method新的参数:
1
method(d);

由于Derive是Base的子类,Derive必须实现Base的所有接口(重写Overriding或者忽略),因此原先的程序(方法method)不会崩溃(d也有doSomething()),从而达成了不修改老代码而更新程序的功能(通过Overriding doSomething()方法)。

多态还有另外一个作用,用Bruce Eckel的话说就是:
利用面向对象的方法,就尽量用多态来替代switch。


第51楼 2005-07-14 08:52 小菜9527 写道:

Re:类的多态


乱了乱了!
X可是Y的父类阿!
a=b 为什么也对阿!
那位在给解释一下吧!
我不太同意用指针解释这个!


第52楼 2005-07-14 09:54 SL_SAY 写道:

Re:类的多态


是一个上转型对象而以


第53楼 2005-07-25 13:06 JeoyRyan 写道:

Re:类的多态


a=b对。
b=a不对


第54楼 2005-07-25 16:35 sss6586576 写道:

Re:类的多态


简单说,在继承类之后如果对父类的方法直接使用那么就叫覆盖(overriding)。如果对父类的方法进行修改则叫做重载(overloading).
overiding:不修改父类方法的参数;
overloading:可以更改父类方法的参数以及定义新的变量等。


第55楼 2005-07-25 17:24 ibmx407vj 写道:

Re:类的多态


写个程序运行一下不就知道了?


第56楼 2005-07-26 04:25 haohaoking 写道:

Re:类的多态


我认为书上说的没有错啊,楼主理解错误了,你举的程序没有错误的


第57楼 2005-07-26 08:19 weining45 写道:

Re:类的多态


sss6586576 :
简单说,在继承类之后如果对父类的方法直接使用那么就叫覆盖(overriding)。如果对父类的方法进行修改则叫做重载(overloading).
overiding:不修改父类方法的参数;
overloading:可以更改父类方法的参数以及定义新的变量等。

另有解释:
如果在子类中定义某方法与其父类有相同的名称和参数,我们说该方法被重写(Overriding)。子类的对象使用这个方法时,将调用子类中的定义,对它而言,父类中的定义如同被“屏蔽”了。如果在一个类中定义了多个同名的方法,它们或有不同的参数个数或有不同的参数类型,则称为方法的重载(Overloading)。

我觉得后者正确啊,sss6586576 的解释是自己总结的还是在书上看到的?


第58楼 2005-07-26 09:34 sss6586576 写道:

Re:类的多态


to weining45:
这是我在学java时,理解的。可能不是非常正确,但对于理解overriding和overloading,我觉得可行。


第59楼 2006-04-15 06:09 gaoyd5177 写道:

Re:类的多态


a=b是绝对对的,回去看看什么叫多态


第60楼 2007-06-25 14:28 Sever 写道:

Re: 类的多态


> > 就像long 比int 能有更多地位一样
> Casting都是一个道理

"子类包含的内容
> 父类都有"

我觉得你没说对吧。应反过来说。


第61楼 2007-06-29 10:26 niubo 写道:

回复: 类的多态

thanks! :)

发表新主题   回复此主题