多态概述
同一个对象,在不同时刻表现出来的不同形态
举例:猫
猫是猫:猫 cat=new 猫();
猫是动物:动物 animal=new 猫();
这里猫在不同时刻表现出来了不同的形态,这就是多态
多态的前提和体现
- 有继承/实现关系
- 有方法吹重写
- 有父类引用指向子类对象
//猫类
public class Cat extends Animal{
@Override
public void eat() {
System.out.println("猫吃鱼");
}
}
//动物类
public class Animal {
public void eat() {
System.out.println("动物吃东西");
}
}
//测试类
public class AnimalDemo {
public static void main(String[] args) {
Animal a=new Cat();
a.eat();
}
}
运行结果:
多态中的成员访问特点
- 成员变量:编译看左边,执行看左边
- 成员方法:编译看左边,执行看右边
为什么成员变量和成员方法的访问不一样:
- 因为成员方法有重写,而成员变量没有
//猫类
public class Cat extends Animal{
public int age=20;
public int weight=10;
@Override
public void eat() {
System.out.println("猫吃鱼");
}
public void playGame() {
System.out.println("玩躲猫猫");
}
}
//动物类
public class Animal {
public int age=40;
public void eat() {
System.out.println("动物吃东西");
}
}
//测试类
public class AnimalDemo {
public static void main(String[] args) {
Animal a=new Cat();
System.out.println(a.age);//运行结果age为40,多态中实际访问的是父类中的变量
// System.out.println(a.weight);//报错,编译要看左边,Animal里没有weight
a.eat();//运行结果是猫吃鱼,访问的是子类中的成员方法,运行看右边
// a.playGame();//报错,方法同样看左边
}
}
多态的好处和弊端
- 多态的好处:提高了程序的扩展性
具体体现:定义方法时,使用父类型作为参数,将来在使用的时候,使用具体的子类型参与操作
- 多态的弊端:不能使用子类的特有功能
//猫类
public class Cat extends Animal {
@Override
public void eat() {
System.out.println("猫吃鱼");
}
}
//狗类
public class Dog extends Animal {
@Override
public void eat() {
System.out.println("狗吃骨头");
}
public void look() {
System.out.println("狗看门");
}
}
//动物类
public class Animal {
public void eat() {
System.out.println("动物吃东西");
}
}
//动物动作类
public class AnimalOperator {
public void useAnimal(Animal a) {//使用父类型作为参数
a.eat();
// a.look();//报错,不能访问具体的子类特有的功能
}
}
//测试类
public class AnimalDemo {
public static void main(String[] args) {
AnimalOperator ao=new AnimalOperator();
Animal a1=new Cat();
Animal a2=new Dog();//只需要添加新的类
ao.useAnimal(a1);
ao.useAnimal(a2);//再调用即可
}
}
运行结果:
多态中的转型
- 向上转型
从子到父
父类引用指向子类对象 - 向下转型
从父到子
父类引用转为子类对象
//猫类
public class Cat extends Animal {
@Override
public void eat() {
System.out.println("猫吃鱼");
}
public void playGame() {
System.out.println("躲猫猫");
}
}
//动物类
public class Animal {
public void eat() {
System.out.println("动物吃东西");
}
}
//测试类
public class AnimalDemo {
public static void main(String[] args) {
Animal a=new Cat();//向上转型
a.eat();
// a.playGame();//报错
Cat c=(Cat)a;//向下转型
c.eat();
c.playGame();
}
}
运行结果: