Java中的多态向上转型和向下转型
目录
多态的向上转型和向下转型
定义
多态的弊端:
不能使用子类的特有功能。
我就想使用子类的特有功能?行不行?
行。
怎么用呢?
A:创建子类对象调用方法即可。(可以,但是很多时候不合理。而且,太占内存了)
B:把父类的引用强制转换为子类的引用。(向下转型)
对象间的转型问题:
向上转型:
Fu f = new Zi();
向下转型:
Zi z = (Zi)f; //要求该f
多态分两种:
(1) 编译时多态(设计时多态):方法重载。
(2) 运行时多态:JAVA运行时系统根据调用该方法的实例的类型来决定选择调用哪个方法则被称为运行时多态。(我们平时说得多的事运行时多态,所以多态主要也是指运行时多态)
代码块
class Fu {
int age=40;
public void show() {
System.out.println("show fu");
}
}
class Zi extends Fu {
int age=20;
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(); //成员方法看右边
System.out.println(+(f.age)); //成员变量看左边,打印
//f.method();
//创建子类对象
//Zi z = new Zi();
//z.show();
//z.method();
//你能够把子的对象赋值给父亲,那么我能不能把父的引用赋值给子的引用呢?
//如果可以,但是如下
Zi z = (Zi)f; //向下转型
z.show();
z.method();
}
}
答案
show zi
show zi
method zi
多态的好处和弊端
好处和弊端
多态的好处
提高了程序的维护性(由继承保证)
提高了程序的扩展性(由多态保证)<可以使代码非常的简洁>
多态的弊端
不能访问子类特有功能
那么我们如何才能访问子类的特有功能呢?
内存结构图
多态的代码示例
class Animal {
public void eat(){
System.out.println("Animal eat");
}
}
class Dog extends Animal {
public void eat() {
System.out.println("Dog eat");
}
public void lookDoor() {
System.out.println("Dog lookDoor");
}
}
class Cat extends Animal {
public void eat() {
System.out.println("Cat eat");
}
public void playGame() {
System.out.println("Cat Playgame");
}
}
class DuoTaiDemo5 {
public static void main(String[] args) {
//内存中的是狗
Animal a = new Dog(); //向上转型
a.eat();
Dog d = (Dog)a; //向下转型
d.eat();
d.lookDoor();
//内存中是猫
a = new Cat(); //a指向了猫
a.eat();
// a.playGame();
Cat c = (Cat)a;
//内存中是猫
Dog dd = (Dog)a; //ClassCastException 猫不能变成狗
}
}