多态
1. 多态
1.1 多态概述
同一个对象,在不同时刻表现出来的不同形态
举例:猫
我们可以说猫是猫:猫 cat = new 猫();
我们也可以说猫是动物:动物 animal = new 猫();
这里猫在不同的时刻表现出来了不同的形态,这就是多态
多态的前提和体现
有继承 /实现关系
有方法重写
有父类引用指向子类对象
1. 多态
1.2 多态中成员访问特点
成员变量:编译看左边,执行看左边
成员方法:编译看左边,执行看右边 为什么成员变量和成员方法的访问不一样呢?
因为成员方法有重写,而成员变量没有
1. 多态
1.3 多态的好处和弊端
多态的好处:提高了程序的扩展性
具体体现:定义方法的时候,使用父类型作为参数,将来在使用的时候,使用具体的子类型参与操作
多态的弊端:不能使用子类的特有功能
1. 多态
1.4 多态中的转型
向上转型 从子到父
父类引用指向子类对象
向下转型 从父到子
父类引用转为子类对象
1. 多态
1.5 多态转型内存图解
public class AnimalDemo {
public static void main(String[] args) { //向上转型
Animal a = new Cat();
a.eat();
//向下转型
Cat c = (Cat) a;
c.eat();
c.playGame();
//向上转型 a = new Dog();
a.eat();
//向下转型
//ClassCastException 类型转换异常 Cat cc = (Cat) a;
cc.eat();
cc.playGame();
} }
栈内存 堆内存
方法:main
方法:main 方法:main Animal a public class Cat extends Animal {
public void eat() {
System.out.println("猫吃鱼");
}
public void playGame() {
System.out.println("猫捉迷藏");
}
} public class Animal { public void eat() {
System.out.println("动物吃东西");
} }
new Cat()001
方法:main
Animal a 001
1. 多态
1.5 多态转型内存图解
public class AnimalDemo {
public static void main(String[] args) { //向上转型
Animal a = new Cat();
a.eat();
//向下转型
Cat c = (Cat) a;
c.eat();
c.playGame();
//向上转型 a = new Dog();
a.eat();
//向下转型
//ClassCastException 类型转换异常 Cat cc = (Cat) a;
cc.eat();
cc.playGame();
} }
栈内存 堆内存
public class Cat extends Animal { public void eat() {
System.out.println("猫吃鱼");
}
public void playGame() {
System.out.println("猫捉迷藏");
} }
new Cat()001
方法:main
Animal a 001
编译看左边 执行看右边
方法:eat 所属:Cat类
方法:eat 所属:Cat类
输出:
猫吃鱼
1. 多态
1.5 多态转型内存图解
public class AnimalDemo {
public static void main(String[] args) { //向上转型
Animal a = new Cat();
a.eat();
//向下转型
Cat c = (Cat) a;
c.eat();
c.playGame();
//向上转型 a = new Dog();
a.eat();
//向下转型
//ClassCastException 类型转换异常 Cat cc = (Cat) a;
cc.eat();
cc.playGame();
} }
栈内存 堆内存
new Cat()001
方法:main
Animal a 001 方法:main
Animal a 001 Cat c
输出:
猫吃鱼
方法:main
Animal a 001 Cat c 001
1. 多态
1.5 多态转型内存图解
public class AnimalDemo {
public static void main(String[] args) { //向上转型
Animal a = new Cat();
a.eat();
//向下转型
Cat c = (Cat) a;
c.eat();
c.playGame();
//向上转型 a = new Dog();
a.eat();
//向下转型
//ClassCastException 类型转换异常 Cat cc = (Cat) a;
cc.eat();
cc.playGame();
} }
栈内存 堆内存
new Cat()001
输出:
猫吃鱼
方法:main
Animal a 001 Cat c 001 public class Cat extends Animal {
public void eat() {
System.out.println("猫吃鱼");
}
public void playGame() {
System.out.println("猫捉迷藏");
}
} 输出:
猫吃鱼
输出:
猫捉迷藏
1. 多态
1.5 多态转型内存图解
public class AnimalDemo {
public static void main(String[] args) { //向上转型
Animal a = new Cat();
a.eat();
//向下转型
Cat c = (Cat) a;
c.eat();
c.playGame();
//向上转型 a = new Dog();
a.eat();
//向下转型
//ClassCastException 类型转换异常 Cat cc = (Cat) a;
cc.eat();
cc.playGame();
} }
栈内存 堆内存
new Cat()001
输出:
猫吃鱼
方法:main
Animal a 001 Cat c 001
输出:
猫吃鱼
输出:
猫捉迷藏
new Dog()002 public class Dog extends Animal {
public void eat() {
System.out.println("狗吃骨头");
}
} public class Animal { public void eat() {
System.out.println("动物吃东西");
} }
方法:main
Animal a 002 Cat c 001
1. 多态
1.5 多态转型内存图解
public class AnimalDemo {
public static void main(String[] args) { //向上转型
Animal a = new Cat();
a.eat();
//向下转型
Cat c = (Cat) a;
c.eat();
c.playGame();
//向上转型 a = new Dog();
a.eat();
//向下转型
//ClassCastException 类型转换异常 Cat cc = (Cat) a;
cc.eat();
cc.playGame();
} }
栈内存 堆内存
new Cat()001
输出:
猫吃鱼
输出:
猫吃鱼
输出:
猫捉迷藏
new Dog()002 public class Dog extends Animal {
public void eat() {
System.out.println("狗吃骨头");
} }
方法:main
Animal a 002 Cat c 001
编译看左边 执行看右边
方法:eat 所属:Dog类
方法:eat 所属:Dog类
输出:
狗吃骨头
1. 多态
1.5 多态转型内存图解
public class AnimalDemo {
public static void main(String[] args) { //向上转型
Animal a = new Cat();
a.eat();
//向下转型
Cat c = (Cat) a;
c.eat();
c.playGame();
//向上转型 a = new Dog();
a.eat();
//向下转型
//ClassCastException 类型转换异常 Cat cc = (Cat) a;
cc.eat();
cc.playGame();
} }
栈内存 堆内存
new Cat()001
输出:
猫吃鱼
输出:
猫吃鱼
输出:
猫捉迷藏
new Dog()002
输出:
狗吃骨头
方法:main
Animal a 002 Cat c 001 方法:main
Animal a 002 Cat c 001 Cat cc
public class Cat extends Animal { public void eat() {
System.out.println("猫吃鱼");
}
public void playGame() {
System.out.println("猫捉迷藏");
} }
public class Animal { public void eat() {
System.out.println("动物吃东西");
} }
public class Dog extends Animal { public void eat() {
System.out.println("狗吃骨头");
} }
输出:
ClassCastException
1. 多态
案例:猫和狗
需求:请采用多态的思想实现猫和狗的案例,并在测试类中进行测试 思路:
①定义动物类(Animal) 成员变量:姓名,年龄 构造方法:无参,带参
成员方法:get/set方法,吃饭()
②定义猫类(Cat),继承动物类 构造方法:无参,带参 成员方法:重写吃饭()
③定义狗类(Dog),继承动物类 构造方法:无参,带参 成员方法:重写吃饭()
④定义测试类(AnimalDemo),写代码测试