多态的好处 与 instanceof关键字
多态的好处
好处:
简化代码,提高了扩展性,提高了查询的可维护性
多态的应用:
使用父类作为一个方法的形参,如果一个父类作为参数,那么我们可以传入父类对象,也可以传入对应的子类,这就是多态的常见应用
使用父类作为一个方法的返回值
public class OOPDemo02 { public static void main(String[] args) { Feeder f = new Feeder(); Panda p = new Panda(); Bam b = new Bam(); f.feeder(p,b); Tig t = new Tig(); Meat m = new Meat(); f.feeder(t,m); Animal pig = new Pig(); Food fodder = new Fodder(); f.feeder(pig,fodder); } } /** * 饲养员 */ class Feeder{ //给熊猫喂竹子 // public void feed(Panda p,Bam b){ // p.show(); // b.show(); // } // // //给老虎喂肉 // public void feederT(Tig t,Meat m){ // t.show(); // m.show(); // } public void feeder(Animal a,Food f){ a.show(); f.show(); } } /*** * 动物类 */ class Animal{ public void show(){ System.out.println("无有东西."); } } //熊猫 class Panda extends Animal{ @Override public void show() { System.out.println("熊猫"); } } //老虎 class Tig extends Animal{ @Override public void show() { System.out.println("老虎"); } } //猪 class Pig extends Animal{ @Override public void show() { System.out.println("猪猪"); } } /** * 食物类 */ class Food{ public void show(){ System.out.println("一大堆的食物"); } } //竹子 class Bam extends Food{ @Override public void show() { System.out.println("竹子"); } } //肉 class Meat extends Food{ @Override public void show() { System.out.println("肉"); } } //猪饲料 class Fodder extends Food{ @Override public void show() { System.out.println("猪饲料"); } }
instanceof关键字
在多态中如果我们想要调用子类特有的方法及属性时是实现不了
多态中的类型转换
向上转型(自动转换)I 格式:<父类型><引用变量名>= new<子类型>();
特点:
子类转为父类父类的引用指向子类对象。自动进行类型转换
此时通过父类引用变量调用的方法是子类覆盖或继承父类的方法
此时通过父类引用变量无法调用子类特有的属性和方法
向下转型(强制转换)
格式:<子类型><引用变量名>=(<子类型>)<父类型的引用变量>;
特点: 父类转为子类,父类引用转为子类对象。强制类型转换
在向下转型的过程中,如果没有转换为真实子类类型,会出现类型转换异常
public class OOPDemo02 { public static void main(String[] args) { Animal p = new Panda(); p.show(); Panda a = (Panda) p; a.study(); } } /*** * 动物类 */ class Animal{ public void show(){ System.out.println("不知道吃啥."); } } //熊猫 class Panda extends Animal{ @Override public void show() { System.out.println("熊猫"); } public void study(){ System.out.println("芜湖。。。。。"); } }
类型转换异常
NewDoctor do1 = (NewDoctor) p;
class NewDoctor extends Animal{
@Override
public void show() {
System.out.println("吃饭");
}
}

instanceof关键字
if (p instanceof Animal){
Panda a = (Panda) p;
a.study();
}else if (p instanceof NewDoctor){
NewDoctor do1 = (NewDoctor) p;
}
测试他左遍的对象是否是它右边的实例,返回boolean类型的数据,
这个关键字通常和向下转型(强制类型转换)结合使用来进行规避
报错

浙公网安备 33010602011771号