黑马程序员技术交流社区
标题:
多态中??
[打印本页]
作者:
曹昌豪
时间:
2012-5-26 12:59
标题:
多态中??
多态的具体体现就是父类的引用指向子类对象,这就会出现向上转型,当然还有向下转型。
有这样的问题:都知道向上向下转型,但是什么时候用向上转型,什么时候用向下转型呢,哪位童鞋给具体整理下答案!
作者:
黑马11期李项京
时间:
2012-5-26 13:44
首先了解一下概念:1、父类引用指向子类对象,而子类引用不能指向父类对象。
2,把子类对象直接赋给父类引用叫upcasting向上转型,向上转型不用强制转换。
如:Father f1 = new Son();
3,把指向子类对象的父类引用赋给子类引用叫向下转型(downcasting),要强制转换。
如:f1 就是一个指向子类对象的父类引用。把f1赋给子类引用s1即 Son s1 = (Son)f1;
其中f1前面的(Son)必须加上,进行强制转换。
4,不过,由于向上转型,a对象会遗失和父类不同的方法,
举个例子:有2个类,Father是父类,Son类继承自Father。
Father f1 = new Son(); // 这就叫 upcasting (向上转型)
// 现在f1引用指向一个Son对象
Son s1 = (Son)f1; // 这就叫 downcasting (向下转型)
// 现在f1还是指向Son对象
第2个例子:
Father f2 = new Father();
Son s2 = (Son)f2; //出错,子类引用不能指向父类对象。
作者:
黑马11期李项京
时间:
2012-5-26 13:47
什么时候向上转型,向下转型,看这段代码:
abstract class Animal
{
abstract void eat();
}
class Cat extends Animal
{
public void eat()
{
System.out.println("吃鱼");
}
public void catchMouse()
{
System.out.println("抓老鼠");
}
}
class Dog extends Animal
{
public void eat()
{
System.out.println("吃骨头");
}
public void kanJia()
{
System.out.println("看家");
}
}
class DuoTaiDemo
{
public static void main(String[] args)
{Funtion f=new Funtion();
f.funtion(new Cat());
}
}
class Funtion
{
public void funtion(Animal a)
//在这里f.funtion(new Cat());——》funtion(Animal a),就相当于完成了一次子类到父类的自动向上转换
{
a.eat();
if(a instanceof Cat)//instanceof(实例化属于)
{
Cat c=(Cat) a;
//这里父类到子类的强制转换
c.catchMouse();
}
else if(a instanceof Dog)
{
Dog d=(Dog) a;
d.kanJia();
}
}
}
作者:
李斌
时间:
2012-5-26 14:17
简单两句话:
1.当需要调用子类的特有内容时,强制向下转型!将父类的引用指向子类对象,变成子类的引用指向子类的对象~
2.当调用的内容为子类和父类共性的内容 或者着是子类覆盖掉父类的功能时 向上转型~
欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/)
黑马程序员IT技术论坛 X3.2