多态
java中如何实现多态?使用多态的好处?
引用变量的两种类型:
编译时类型(模糊一点,一般是一个父类)
public void (Pet pet);
由声明时的类型决定。
运行时类型(运行时,具体是哪个子类就是哪个子类)
由实际对应的对象类型决定。
多态的存在要有3个必要条件:
要有继承,要有方法重写,父类引用指向子类对象
为什么有重写?
父类引用指向子类对象一定用父类对象去调用子类方法,
调用的一定是被重写的方法。
为什么需要多态(封装以及继承)
1.多态
提高了程序的可扩展性和可维护性
提高代码复用性
2.封装
安全
提高代码复用性
3. 继承
提高代码复用性
多态的用2种表现形式
1.父类作为方法的参数
public 返回值类型 方法名(父类类型 对象名){ } public void feed (Pet pet){ }
2.父类作为方法返回值(又称为工厂设计模式)
父类作为方法的返回值类型 public Pet getPet(int type) { // 声明一个pet对象 Pet pet = null; switch (type) { case 1: // 父类的引用指向子类的对象 pet = new Dog("旺财",2,60,"金毛"); break; }
具体应用:(以下代码都省去构造器和set,get设置器)
public class Cat extends Pet{
private String color;
@Override
public void eat() {
System.out.println("猫在吃鱼");
}
@Override
public void bark() {
System.out.println("miao miao miao");
}
}
public class Dog extends Pet{
private String brand;
@Override
public void eat() {
System.out.println("狗在吃骨头");
}
@Override
public void bark() {
System.out.println("won won won");
}
}
public abstract class Pet { private String name; private int age; private int love; private int health; public abstract void eat(); public abstract void bark(); }
2种多态的用法如下彩色字段
public class Person { /** * 领养宠物的方法 * 父类的类型作为方法返回值的类型 * @return */ public Pet getPet() { Scanner input = new Scanner(System.in); System.out.println("请输入索要领养的宠物的类型 1,狗 2,猫 3,猪"); int type = input.nextInt(); Pet pet = null; if (type == 1) { pet = new Dog(); }else if(type == 2){ pet = new Cat(); }else { pet = new Pig(); } return pet; } public void feed(Pet pet) { pet.eat(); } }
public class Test { public static void main(String[] args) { Person xiaoming = new Person(); Pet pet = xiaoming.getPet(); System.out.println(pet); xiaoming.feed(pet); } }
pig类可以看出多态的可扩展性
public class Pig extends Pet{ @Override public void eat() { System.out.println("猪在吃白菜"); } @Override public void bark() { System.out.println("heng 哼"); } }