黑马程序员技术交流社区

标题: Java多态 [打印本页]

作者: 杨盼    时间: 2012-2-28 19:22
标题: Java多态
怎么理解向上转型和向下转型,这两个有点晕乎了。如何应用
作者: 王--明    时间: 2012-2-28 19:29
举个例子:有两个类,Father是父类,Son类继承自Father。

Father f1 =new Son() ; //这就叫upcasting(向上转型 )

//现在f1 引用一个指向 一个Son 对象

Son s1 = (Son)f1 ;  //这个叫downcasting(向下转型 )

//现在f1还是指向Son对象

第二个例子:

Father f2 =new Father();

Son s2=(Son)f2;     //出错,子类引用不能直接指向父类对象

你或许会问,在第一个例子中:Son s1=(Son)f1;为什么是正确的呢?

很简单因为f1指向指向一个子类对象,Father f1=new Son();子类s1引用当然可以指向子类对象了。

而f2被传给了一个Father对象,Father f2=new Father();子类s1引用不能指向父类对象。

总结:

1.父类引用指向子类对象,子类引用不能指向父类对象。

2.把子类对象直接赋给父类引用叫upcasting向上转型,向上转型不用强制转型。

如Father f1=new Son();

3.把指向子类对象的父类引用赋给子类引用叫向下转型(downcasting),要强制转型。
如f1就是一个指向子类对象的父类引用,把f1赋给子类引用s1 即Son s1=(Son)f1;
其中f1前面的(Son)必须添加,进行强制转换。
4.upcasting 会丢失子类特有的方法(下面有说明),但是子类overriding 父类的方法,子类方法有效

5.向上转型的作用, 减少重复代码(如下所述)


作者: 佟都    时间: 2012-2-28 19:34
本帖最后由 tongdu_simon 于 2012-2-28 19:43 编辑

1、父类引用指向子类对象,而子类引用不能指向父类对象。

2、把子类对象直接赋给父类引用叫向上转型,向上转型不用强制转换。

      如:Fruit f1 = new Apple();

3、把指向子类对象的父类引用赋给子类引用叫向下转型,要强制转换。

   如:f1 就是一个指向子类对象的父类引用。把f1赋给子类引用a1即 Apple a1 = (Apple)f1;

           其中f1前面的(Apple)必须加上,进行强制转换。


示例代码1:
  1. Fruit f1 = new Apple();   // 向上转型

  2. Apple a1 = (Apple)f1;    // 向下转型
复制代码
示例代码2:
  1. Fruit f2 = new Fruit();

  2. Apple a2 = (Apple)f2;       // 出错,子类引用不能指向父类对象
复制代码

作者: 周峰    时间: 2012-2-28 19:35
不用晕!
你说的就是显式和隐式转换!显示转换是我们一般用在强转  
比如

  1.      int i=0;
  2.      long l=i;   //long的范围比int大,就是所谓的“向上”  他会自动帮你转!
  3.      int i2=(int)l;    //int的范围比long小,就是所谓的“向下"  必须你自己强转!
复制代码
要是这小例子你还晕  OK  我教你小白法!

你想象有一个int  是个小盒子,    long  是一个大盒子,     小盒子装进大盒子里面你是不是直接就放进去了?

OK  大盒子你要放进小盒子里面怎么办?  塞呗。  怎么塞?  前面加上(int) 告诉java  我要把大盒子强行塞进小盒子里面!

会有一部分塞不进  这些塞不进的 通常我们叫做溢出!   就好比  3.33  浮点型 放进整型里面   那0.33 就没了 溢出了 放不下!
作者: 杨盼    时间: 2012-2-28 19:49
周峰 发表于 2012-2-28 19:35
不用晕!
你说的就是显式和隐式转换!显示转换是我们一般用在强转  
比如要是这小例子你还晕  OK  我教你小 ...

对象既可以作为它自己本省的类型使用,也可以作为它的基类型使用,而这种把对某个对象的引用视为对其基类型的引用的做法被称为向上转型
向下转型就是在继承层次中向下移动
我怎么对不上号啊
作者: 周峰    时间: 2012-2-28 19:51
杨盼 发表于 2012-2-28 19:49
对象既可以作为它自己本省的类型使用,也可以作为它的基类型使用,而这种把对某个对象的引用视为对其基类 ...

那可能我误解了。 你说的是装箱和拆箱吧?
作者: 杨盼    时间: 2012-2-28 19:53
周峰 发表于 2012-2-28 19:51
那可能我误解了。 你说的是装箱和拆箱吧?

不是啊,是类对象的方面的
作者: 周峰    时间: 2012-2-28 19:55
杨盼 发表于 2012-2-28 19:53
不是啊,是类对象的方面的

能放点代码吗? 你那一句话 我确实不知道你哪里不懂。  
作者: 杨盼    时间: 2012-2-28 19:56
tongdu_simon 发表于 2012-2-28 19:34
1、父类引用指向子类对象,而子类引用不能指向父类对象。

2、把子类对象直接赋给父类引用叫向上转型,向上 ...

那现在我稍微理解点了向上转型,就像集合就是向上转型:
List<???> obj=new ArrayList<???>();
那向下转型在什么情况下应用呢?
作者: 周峰    时间: 2012-2-28 20:07
杨盼 发表于 2012-2-28 19:56
那现在我稍微理解点了向上转型,就像集合就是向上转型:
List obj=new ArrayList();
那向下转型在什么情况 ...

对  就是这样!  List 是父类  可以new 出他的 儿子,也就是子类,

好了 现在我过来,,  用 ListArray 去 new List 老爸 你说  可以吗?  儿子可以生出老爸吗?当然不行! 现实生活中也只有老爸能生出儿子!

如果 你想转 可以强制来一下  (ListArray)list   前面标记强转就可以了!


作者: 佟都    时间: 2012-2-28 21:17
本帖最后由 tongdu_simon 于 2012-2-28 21:18 编辑
杨盼 发表于 2012-2-28 19:56
那现在我稍微理解点了向上转型,就像集合就是向上转型:
List obj=new ArrayList();
那向下转型在什么情况 ...


这个我也只是知道基本类型的转型,知道向下转型是不安全的,以及在父类对象使用子类方法的排错处理。

至于“向下转型”在泛型中的应用,还没有学到那来{:soso_e130:}




欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/) 黑马程序员IT技术论坛 X3.2