虽然多态有此弊端,那我就想使用子类的特有功能行不行?
- 行
怎么用?
- A:创建子类对象,调用方法即可(可以,但是很多时候不合理。而且太占内存了)
- B:把父类的引用强制转换为子类的引用。(向下转型)
对象间的转型问题:
- 向上转型:Fu f = new Zi();
- 向下转型:Zi z = (Zi) f ;//要求该f必须是能够转换为Zi的。
代码举例:
class Fu {
public void show() {
System.out.println("show fu");
}
}
class Zi extends Fu {
public void show() {
System.out.println("show zi");
}
public void method() {
System.out.println("method zi");
}
}
class DuoTaiDemo4 {
public static void main(String[] args) {
//测试
Fu f = new Zi();
f.show();
//f.method();
//创建子类对象
//Zi z = new Zi();
//z.show();
//z.method();
//你能够把子的对象赋值给父亲,那么我能不能把父的引用赋值给子的引用呢?
//如果可以,代码如下:
Zi z = (Zi)f;
z.show();
z.method();
}
}
多态向下转型中常出现的问题:
- ClassCastException:类型转换异常
代码举例:
class Animal {
public void eat() {
}
}
class Dog extends Animal {
public void eat(){
}
public void lookDoor() {
}
}
class Cat extends Animal{
public void eat() {
}
public void playGame() {
}
}
class DuoTaiDemo5 {
public static void main(String[] args) {
//内存中是狗
Animal a = new Dog();
Dog d = (Dog)a;
//内存中是猫
a = new Cat();
Cat c = (Cat)a;
//内存中是猫
//ClassCastException 报错,类转换异常
//Dog dd = (Dog)a;
}
}
孔子装爹案例帮你理解多态:
class 孔子爹 {
public int age = 40;
public void teach() {
System.out.println("讲解JavaSE");
}
}
class 孔子 extends 孔子爹 {
public int age = 20;
public void teach() {
System.out.println("讲解论语");
}
public void playGame() {
System.out.println("英雄联盟");
}
}
//Java培训特别火,很多人来请孔子爹去讲课,这一天,孔子爹被请走了
//但是还有人来请,就剩孔子在家,价格还挺高,孔子一想,我是不是可以考虑去呢?
//然后就穿上爹的衣服,带上爹的眼镜,粘上小胡子,就开始装爹
//向上转型
孔子爹 k爹 = new 孔子();
//到人家那里去了
System.out.println(k爹.age);//40
k爹.teach();//讲解论语
k爹.playGame();//这是儿子才做的 报错
//讲完了,下班回家了
//脱下爹的装备,换上自己的装备
//向下转型
孔子 k = (孔子)k爹;
System.out.println(k.age);
k.teach();//讲解论语
k.playGame();//英雄联盟