黑马程序员技术交流社区

标题: 向上转型和向下转型 [打印本页]

作者: 李前进    时间: 2014-3-29 20:00
标题: 向上转型和向下转型
什么是向上转型和向下转型?

猫  x = new 猫();
动物  x = new 猫();

这样属于向上转型还是向下转型啊?
作者: optimisticpig    时间: 2014-3-29 20:12
这是父类引用指向子类对象,多态的表现
作者: majunm    时间: 2014-3-29 20:13
向上转型: Person p = new Man() ; //向上转型需要强制类型转化
向下转型: Man man = (Man)new Person() ; //必须强制类型转化
Cat cat =(Cat)new Anima(); //向下转型   动物自降身价 变猫
Anima anima = new Cat();//向上转型    猫升级为动物
作者: majunm    时间: 2014-3-29 20:25
Anima anima = new Cat();
                Cat cat2 = (Cat) anima;  //两句都写上   向下转型 才是正确的
作者: Amorvos    时间: 2014-3-29 21:01
所谓向上转型就是将子类变量升级成父类变量,向上转型是安全的。
向下转型是将父类强制转换成子类,这一般是不安全的,存在精度损失之类的变量损失问题
作者: syusikoku    时间: 2014-3-29 21:43
我给你举个例子。动物-->>狗/猫,这样是向下转换.狗/猫--->>动物,这个是向上转型
作者: liushui12344    时间: 2014-3-29 22:04
Animal a = new Cat()//此时是将猫转化为动物,是向上转型,
Cat cat = (Cat)a;//此时是把父类的引用a转化为猫类型,此处应注意的是强转的是父类的引用!不是父类.

从头到尾都是转的子类对象.
作者: ╰青青子佩ˊゝ    时间: 2014-3-29 22:24
这个不是转型啦,给你举个例子吧
  1. abstract class Animal{
  2.         public abstract void eat();
  3. }
  4. class Cat extends Animal{
  5.         public void eat(){
  6.                 System.out.println("eat fish");
  7.         }
  8.         public void catchMouse(){
  9.                 System.out.println("catch mouse");
  10.         }
  11. }
  12. class Dog extends Animal{
  13.         public void eat(){
  14.                 System.out.println("eat bone");
  15.         }
  16.         public void guard(){
  17.                 System.out.println("guard dog");
  18.         }
  19. }
  20. //多态转型,当要调用猫的特有方法时
  21. class  PolymorphicDemo{
  22.         public static void main(String[] args) {
  23.                 Animal a = new Cat();
  24.         //        a.catchMouse();//错误写法
  25.                 Cat c = (Cat)a;
  26.                 c.catchMouse();
  27.         }
  28. }
复制代码

作者: 小武8686886    时间: 2014-3-29 22:55
面向对象中的转型只会发生在有继承关系的子类和父类中(接口的实现也包括在这里)。
假如有父类:人,子类:男人和女人。
向上转型: Person p = new Man() ; //向上转型不需要强制类型转化
向下转型: Man man = (Man)new Person() ; //必须强制类型转化
作者: 小班。    时间: 2014-3-30 12:15
这个需要分清父类和子类。应用在类的引用变量引用对象的问题上。
向上转型:父类的引用指向了一个子类的对象。这时子类对象在使用时可以当做就是一个父类在使用。
向下转型:子类的引用变量指向了一个父类的对象,在这时需要强制的类型转换。

猫  x = new 猫();//这个没有转换,就是一个猫类的引用变量指向了一个猫类的对象
动物  x = new 猫();//很明显,动物是猫的父类,即父类的动物引用变量指向了子类的猫对象。这属于向上转型。

猫 X = (猫)new 动物();这时向下转型,需要强制转换。





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