JAVA面向对象三大特性之一:多态

概述
多态是继封装、继承之后,面向对象的第三大特性

生活中,比如交通工具的种类可以分为飞机、汽车、轮船

再比如交通工具的运行方式飞机运行方式是飞在天上、汽车是在马路上开、轮船是在海上行驶

可见,同一行为,通过不同的事物,可以体现出来的不同的形态

多态,描述的就是这样的状态。

使用多态的前提:

1. 存在继承或者实现关系
2. 子类或实现类必须重写父类方法
3. 父类引用指向子类对象

例:

创建一个Animal父类

public class Animal{
    private String name;
    private int age;

    public void eat (){
        System.out.println("动物吃饭");
    }

}

创建一个Dog类继承Animal类,且重写父类方法

public class Dog extends Animal{
    private String name;
    private int age;

    @Override
    public void eat(){
        System.out.pringln("狗正在吃饭");
    }

    public void sleep(){
        System.out.println("狗正在睡觉");
    }
}

主方法内:

Animal a = new Dog();
a.eat();        //输出:狗正在吃饭
a.sleep();      //编译出错,无法执行

使用父类引用指向子类对象(多态),也就是将Dog类向上转型成Animal类(小的数据类型变成大的数据类型)

重写了父类成员方法后,父类引用指向子类对象调用成员方法,则会运行输出子类的方法体

不能调用子类特有成员方法!!!!

若想调用子类特有成员方法,则需要使用到一个instanceof 判断对象类型

格式:

对象名  instanceof  类名

Animal a = new Dog();
if(a instanceof Dog){
    System.out.println("此对象属于Dog类");
}else{
    System.out.println("不属于");       
}

判断属于Dog类后,可以使用向下转型(大的数据类型强转成小的数据类型)

子类类型  变量名  =  (子类类型)  父类变量名;

向下转型后的变量数据类型转换回子类,可以调用子类特有方法

Animal a = new Dog();
if(a instanceof Dog){
    Dog dog = (Dog) a;
}
dog.sleep();        //输出:狗正在睡觉

现实开发使用中,直接使用父类指向子类对象,然后调用重写方法使用性很低

一般使用多态的场景

使用父类作为方法参数 ,便可以将所有子类传至方法中

创建多一个Cat类

public class Cat extends{
    private String name;
    private int age;
    
    @Override
    public void eat(){
        System.out.println("猫正在吃饭");
    }

    public void jump(){
        System.out.println("猫正在跳");
    }
}

创建一个方法参数为父类Animal:

创建Cat、Dog两个对象,然后传入方法中

实际上这就是多态:

Cat c = new Cat();

Animal a = c;     //c也就是 new Cat();

Animale a = new Cat();

并且在此类方法体中,还可以通过instanceof判断数据类型

然后向下转型,调用子类特有方法

public static void (String [] args){
Cat c = new Cat();
Dog d = new Dog();
whoEat(c);        //输出:猫正在吃饭
whoEat(d);        //输出:狗正在吃饭
}

public static void whoEat(Animal a){
    a.eat();
    if(a instanceof Cat){
        Cat c1 = (Cat)a;
        c1.jump();         //输出:猫正在跳
    }else if (a instanceof Dog){
        Dog d1 = (Dog)a;
        d1.sleep();        //输出:猫正在睡觉
    }
}

猜你喜欢

转载自blog.csdn.net/weixin_42022555/article/details/81407202
今日推荐