多态

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 哼");
	}

}

01-16 21:36