面向对象5---多态

来源:互联网 发布:手机流量软件 编辑:程序博客网 时间:2024/06/15 00:13

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

  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("--------");    }}

这里写图片描述

原创粉丝点击