首页 > 技术文章 > Java学习--多态

Jims2016 2018-08-17 20:45 原文

1. 多态

多态:同一个对象(实物),在不同时刻体现出来的不同状态

多态的前提:

A:要有继承关系

B:要有方法重写

C:要有父类引用指向子类对象

    父类 f = new 子类()

多态中的成员访问特点:

A:成员变量

编译看左边,运行看左边

B:构造方法

创建子类的时候,访问父类的构造方法,对父类的数据进行初始化

C:成员方法

编译看左边,运行看右边

D:静态方法

编译看左边,运行看右边(静态和类相关,算不上重写,所以访问还是左边的)

 

由于成员方法存在方法重写,所以它运行看右边

 

多态的好处:

  1. 提高了代码的维护性(继承保证)
  2. 提高了代码的扩展性(由多态保证)

多态的弊端:

  1. 不能使用子类的特有功能

把父类的引用强制装换为子类的引用(向下转型)

1.猫和狗多态练习

class Anamial{

    public void eat(){
        System.out.println("动物吃");
    }
    
}

class Dog extends Anamial{
    public void eat(){
        System.out.println("狗吃骨头");
    }
    public void lookDoor(){
        System.out.println("狗看门");
    }
}

class Cat extends Anamial{
    public void eat(){
         System.out.println("猫吃鱼");
    }
    public void play(){
         System.out.println("狗玩游戏");
    }
    
}

class ExtendsDemo{
    public static void main(String[] args){
        System.out.println("Extends ");
        //定义动物为狗
        Anamial a = new Dog();
        a.eat();
        //a.lookDoor(); 编译会报错,动物没有狗的方法
        //将动物还原成狗
        Dog d = (Dog)a;
        d.eat();
        d.lookDoor();
        
//a变成猫 a
= new Cat(); a.eat(); //a.play(); 编译会报错,动物没有play方法 //将动物还原为狗 Cat c = (Cat)a; c.eat(); c.play(); //Dog dd = (Dog)a; 编译不会报错,运行报错 java.lang.ClassCastException: Cat cannot be cast to Dog //不能将毛转换成狗 } }

 

推荐阅读