Java学习--多态

时间:2023-03-09 20:33:23
Java学习--多态

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
//不能将毛转换成狗 }
}