package com.duolianxidemo;
/**
* 多态:对应同一个指令(调用同一个名称的方法),不同滴对象给予不同的反应(不同滴方法实现)
* 规范:(多态实现的前提)
* 1.必须要有继承关系
* 2.子类必须重写父类的方法
* 3.父类引用指向子类的对象(向上转型 自动转换)
* 4.(向下转型 强制转换)例如:
* Pet pet = new Pet();
* Dog dog = (Dog)pet;
* 【Dog为子类,Pet为父类】,
* 编译通过,但是运行错误
* 多态的目的:
* 1.提高代码的扩展性和可维护性
* 2.方便逻辑代码的编写
* 多态的两种表现形式:
* 1.父类作为子类的参数
* 2.父类作为方法的返回值类型
* 注意:
* 1.向上转型的对象不能操作新增的成员变量和方法
* 2.向上转型可以操作继承或者重写来的属性和方法
*
* 关键字instanceof:
* 判断一个实例是否是一个类的对象
*/
Pet类:
public abstract class Pet {
//抽象方法
public abstract void feed();
public void show(){
System.out.println("show...");
}
}
Dog类:
package com.duolianxidemo; public class Dog extends Pet { public void feed(){ System.out.println("狗狗在吃骨头..."); } public void pp(){ System.out.println("ppp... ..."); } }
Penguin类:
package com.duolianxidemo; public class Penguin extends Pet { @Override public void feed(){ System.out.println("企鹅正在吃小鱼..."); } }
Tiger类:
package com.duolianxidemo; public class Tiger extends Pet { public void feed(){ System.out.println("老虎在吃生肉..."); } }
Person类:
package com.duolianxidemo; public class Person { // public void feed(Dog dog){ // dog.feed(); // } // public void feed(Penguin p){ // p.feed(); // } //使用多态解决这个问题 public void feed(Pet pet){ pet.feed(); } public Pet getPet(String Id){ if (Id.equals("0")){ return new Dog(); }else if(Id.equals("1")){ return new Penguin(); }else{ return new Tiger(); } } public static void main(String[] args) { Person p = new Person(); Pet dog = new Dog();//父类引用指向子类的对象,向上可以自动转型 //dog.pp(); dog.show(); p.feed(dog); Penguin p1 = new Penguin(); p.feed(p1); Pet tiger = new Tiger(); tiger.feed(); Pet pet = p.getPet("3"); if (pet instanceof Dog){ System.out.println("你领养的是狗狗!"); }else if (pet instanceof Penguin){ System.out.println("你领养的是小企鹅!"); }else /*if (pet instanceof Tiger)现阶段写不写我认为都行*/{ System.out.println("恭喜你sb,领养的是一只大老虎!"); } } }