多态的应用
1.多态的构建:
自我理解:就是 父类引用指向子类对象。
功能 : 父类能调用父类对应子类的方法和属性,但是都是优先调用 重写的方法 或 子类的属性!
创建子类构造器,就是先进入子类构造器,然后默认第一行进入父类构造器:
1.这里先创建父类的对象,给父类对象赋值,或者不赋值就是默认值,把父类的属性继承给子类。
2.接着回到子类构造器,给子类构造器进行赋值,如果和父类属性重复,子类会把父类属性的值给覆盖
3.最后判断子类还有没有 没有 进入构造器的属性,如果有,就是默认值,若与父类属性重复,将会把默认值覆盖父类属性的值。
4.最后完成构造,创建子类的的对象,并且合并刚刚的父类构造,该检查过的都检查过了,该覆盖的都覆盖了,不会在有重复的属性了,接下来就是两个对象结合,形成一个新的子类对象。
并把这个对象的地址,用父类接收,也就是我们所说的,父类指向子类的对象。
注意:1.父类不能用子类独有的方法,但是经过子类重写的方法,优先调用重写的方法。
2.父类接收其实是指:子类的父类形态,从父类看过去,就是父类中子类的形态,抽象一点就是和一面镜子一样!
2.多态的应用:
接下来将是多态的两种应用:
- 将父类作为参数进行多态!可以传递任意一个子类对象
//喂宠物的方法public void feed(Animal animal){animal.eat();}
- 将父类作为返回值进行多态的应用!可以返回任意一个子类对象
刚刚在Animal父类下创建了eat();方法
并在四种动物,也就是Animal的子类下,重写了四种不同的eat();方法
在测试类里,用多态实现,对各种子类的调用
//获得宠物的方法public Animal getAnimal(String type){Animal animal=null;switch (type){case "dog":animal=new Dog();break;case "bird":animal=new Bird();break;case "fish":animal=new Fish();break;case "snake":animal=new Snake();break;}return animal;}
最后测试类去实现
package com.qf.extendsTest;import java.util.Scanner;public class DuoTai1 {public static void main(String[] args) {//要调用该类的方法,必须创建该类的对象DuoTai1 duoTai1 = new DuoTai1();Scanner scanner = new Scanner(System.in);System.out.println("请输入你要收养的宠物类型:");String type = scanner.next();//获取子类,把父类引用指向子类的对象Animal animal = duoTai1.getAnimal(type);duoTai1.feed(animal);}//获得宠物的方法public Animal getAnimal(String type){Animal animal=null;switch (type){case "dog":animal=new Dog();break;case "bird":animal=new Bird();break;case "fish":animal=new Fish();break;case "snake":animal=new Snake();break;}return animal;}//喂宠物的方法public void feed(Animal animal){animal.eat();}}