多态!
多态
多态就是用父类的引用调用子类里重写过的方法(调用的这个子类方法父类必须经过重写!!!)
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 哼");
}
}
浙公网安备 33010602011771号