面向对象5---多态

一.多态的概述及前提条件

  1. 多态:某一个事物,在不同时刻表现出来的不同状态
  2. 多态的前提条件:
    • 必须有继承关系
    • 继承一个类的同时,子类中必须有方法重写
    • 父类的引用指向子类对象(向上转型)
      格式:Fu f = new Zi();(将f代表的父类引用指向堆内存的子类对象)

二.多态成员访问特点

成员变量:编译看左,运行看左
非静态成员方法:编译看左,运行看右
静态成员方法:编译看左,运行看左
(编译看左,如果左没有这个成员,报错)
看程序写结果:

class A
{
    public void show()
    {
        show2();
    }

    public void show2()
    {
        System.out.println("我");
    }
}
class B extends A 
{
    public void show2()
    {
        System.out.println("爱");
    }
}
class C extends B 
{
    public void show()
    {
        super.show();
    }

    public void show2()
    {
        System.out.println("你");
    }
}

public class Test 
{
    public static void main(String[] args) 
    {
        A a = new B();
        a.show();

        B b = new C();
        b.show();
    }
}
结果:爱你

继承里面:如果子类继承父类,会将父类中的方法继承过来,子类没写,默认有这样的方法
子父类中的分层初始化!(父类先进行初始化,子类进行初始化!)
分析:
a.show(),show非静态成员方法,编译看左,运行看右.B类继承A类,,继承过来show方法,输出show2中的”爱”
b.show(),show非静态成员方法,编译看左,运行看右.C类继承B类,执行show2,输出”你”


三.多态的好处及弊端

  1. 多态的好处:
    提高代码维护性(又继承保证)
    提高代码扩展性(由多态保证)

  2. 多态的弊端:父类对象不能访问子类特有功能
    解决方法:
    a.创建子类对象
    b.把父类的引用强制转换为子类对象(向下转型)

    Fu f = new Zi() ;向上转型
    Zi z = (Zi)(f) ;向下转型

  3. 使用向下转型会出现一个异常:(运行时期的异常)ClassCastException

class Animal2{
    public void eat(){
    }
    public void sleep(){}
}

class Cat2 extends Animal2{

}
class Dog2 extends Animal2{

}
public class Demo2{
    public static void main(String[] args) {
        //使用向上转型
        Animal2 a = new Cat2() ;//猫是动物:内存是猫

        //还原成猫
        //向下转型
        Cat2 c1 = (Cat2) a ;//内存还是猫

        //向上转型
        a = new Dog2() ;//内存是狗

        //还原成狗
        Dog2 d = (Dog2) a ;//内存还是狗

        //编译不报错!,运行发生一个异常!:ClassCastException:(RuntimeException:运行时期的异常!)
        Cat2 c2 = (Cat2) a ;        
    }
}

四.多态的练习

1.猫狗案例多态版:

/*
 * 猫狗案例练习多态版
 * 动物:
 *      吃();
 * 猫 extends 动物{
 *      重写eat();
 *      猫玩游戏();
 * }
 * 狗 extends 动物{
 *      重写eat();
 *      狗看门();
 * }
 * 
 * */
class Animal{
    public void eat(){
        System.out.println("吃饭");
    }
}

//定义猫类
class Cat extends Animal{
    @Override
    public void eat(){
        System.out.println("猫吃鱼..");
    }

    //特有功能
    public void playGame(){
        System.out.println("猫玩游戏..");
    }
}

//定义狗类
class Dog extends Animal{
    @Override
    public void eat(){
        System.out.println("狗吃猫..");
    }

    //特有功能
    public void lookDoor(){
        System.out.println("狗看门...");
    }
}
//测试类
public class Demo1{
    public static void main(String[] args) {
        //向上转型:测试猫
        Animal a = new Cat() ;
        a.eat();

        //报错,不能调用子类特有的方法
//      a.playGame();

        //还原成猫:向下转型
        Cat c = (Cat) a;
        c.eat();
        c.playGame();
        System.out.println("--------");

        Animal e = new Cat() ;
        e.eat();

        //报错,不能调用子类特有的方法
//      e.playGame();

        //还原成狗:向下转型
        Cat f = (Cat) e;
        f.eat();
        f.playGame();
        System.out.println("--------");
    }
}

这里写图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值