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,领养的是一只大老虎!");
}
}
}
面向对象----多态
最新推荐文章于 2024-07-29 14:22:26 发布