什么是多态?
字面意思:多种形态
父类中的方法在不同的子类中有不同的体现(实现),即同一条消息在不同的类中有不同的体现。
分三步去实现多态:1、父类引用指向子类对象,2、继承,3、方法重写
栗子1:
宠物类
package com.name.day_06;
/**
* @author ***
* @date 2020/9/14 15:34
* @describe
*/
public class Pet {
void eat(String food){}
}
class Dog extends Pet{
@Override
void eat(String food) {
System.out.println("小狗再吃:"+food);
}
}
class Cat extends Pet{
@Override
void eat(String food) {
System.out.println("小猫再吃:"+food);
}
}
class Mouse extends Pet{
@Override
void eat(String food) {
System.out.println("小老鼠吃:"+food);
}
}
主任类
public class Master {
//主任喂养小狗
void feed(Dog dog,String food){
System.out.println("主任正在喂养");
dog.eat(food);
}
//主任正在喂养小猫
void feed(Cat cat,String food){
System.out.println("主任正在喂养");
cat.eat(food);
}
//主任正在喂养小老鼠
void feed(Mouse mouse,String food){
System.out.println("主任正在喂养");
mouse.eat(food);
}
测试类
public class Test {
public static void main(String[] args) {
//创建主任类对象
Master master=new Master();
//创建小狗的对象
Dog dog=new Dog();
master.feed(dog,"狗肉火锅");
//创建小猫的对象
Cat cat=new Cat();
master.feed(cat,"好多鱼");
//创建小老鼠的对象
Mouse mouse=new Mouse();
master.feed(mouse,"大米");
}
}
分析
栗子1,没有使用多态,虽然语法没有什么问题,但是如果宠物类持续增加(继承父类),主任类就得跟着增加喂养的方法。不仅造成了代码的冗余,而且还容易出错。
这里提一下面向对象的设计原则:对扩展(新增功能)开发对修改(修改现有的功能)关闭。
栗子2:使用多态
宠物类
package com.name.day_06;
lic class Pet {
void eat(String food){}
}
class Dog extends Pet{
@Override
void eat(String food) {
System.out.println("小狗再吃:"+food);
}
}
class Cat extends Pet{
@Override
void eat(String food) {
System.out.println("小猫再吃:"+food);
}
}
class Mouse extends Pet{
@Override
void eat(String food) {
System.out.println("小老鼠吃:"+food);
}
}
public class Master {
void feed(Pet pet,String food){
System.out.println("主人正在喂养");
pet.eat(food);
}
}
测试类
public class Test {
public static void main(String[] args) {
//创建主任类对象
Master master=new Master();
//创建小狗的对象
Dog dog=new Dog();
master.feed(dog,"狗肉火锅");
//创建小猫的对象(父类引用指向子类对象)
Pet cat=new Cat();
master.feed(cat,"好多鱼");
Pet pet=new Mouse();
master.feed(pet,"大米");
}
}
这样,无论添加多少个宠物子类,这个主任类不需要变动。