多态的好处 与 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类型的数据,

这个关键字通常和向下转型(强制类型转换)结合使用来进行规避

报错

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

posted @ 2022-06-18 15:51  魔光领域  阅读(28)  评论(0编辑  收藏  举报