0905 Java中多态的向上转型和向下转型

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  猫不能变成狗
    }
}

多态内存结构图

这里写图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值