09 多态

1 多态

1.1 为什么要使用多态?

软件架构过程中,有一个开闭原则:对修改关闭,对扩展开放。

我们需要升级业务,业务的拓展不应该导致程序或者程序架构做过大调整。

 

 

1.2 多态

1.2.1 多态的概念

生活中,存在这种现象

 

同一个拍照,由于选用的拍照设备不同,产生的照片不同。

 

 

 

同一事物,由于条件不同,产生结果也不同。

 

多态就是事物呈现的多种状态。

 

 

 

程序中,多态

 

多态:同一个引用类型,使用不同的实例而执行不同操作 

 

 

public class Test01 {
    public static void main(String[] args) {
        // 多态:同一引用类型,不同实例,执行结果不同
        // java中的多态要求:父类类型引用子类对象
        
        Animal animal = null;
        
        animal = new Person();
        animal.sleep();
        
        
        animal = new Fish();
        animal.sleep();
        
    }
}

 

 

 

 

总结:

 

[1] 多态 同一引用类型,由于实例化的实例不同,导致对同一方法的执行结果不同。

 

: 同一引用类型

 

不同实例化的实例

 

:同一方法,该方法一般都会被重写。

 

不同执行结果不同

 

 

 

[2] java多态要求一定是父类引用=子类对象

 

 

父类类型 父类对象 = new 子类类型()

 

 

 

 

1.1.1 多态表现形式

 

[1] 本质:父类引用子类对象

 

 

 

[2] 父类对象作为方法形参

 

 

public void feed(Pet pet) {
        System.out.println("主人在喂" + pet.getName());
        pet.eat();
}

 

 

 

 

[3]父类作为方法返回值实现多态

 

 

    public Pet getPet(int type) {
        Pet pet = null;
        switch(type) {
            case 1:{
                pet = new Dog();break;
            }
            case 2:{
                pet = new Penguin();break;
            }
            case 3:{
                pet = new Cat();break;
            }
        }
        return pet;
    }

 

 

 

 

1.1 多态中类型转换

 

1.1.1 自动类型转换

 

子类可以无条件转换为父类类型也称为向上类型转换

 

父类类型 父类引用 = 子类对象

 

 

 

1.1.2 强制类型转换

 

父类调用子类特有方法时,一定要进行强制类型转换,也称为向下类型转换

 

子类类型 子类对象= (子类类型)父类对象

 

Dog dog = (Dog)pet;

 

Penguin penguin = (Penguin)pet;

 

 

 

注意:强制类型转换有个前提:一定要转换为父类对象引用的实际的子类类型

 

 

 

 

 

obj instanceof Class/Interface 判断对象是否是或者接口的实例。

 

 

public class Test01 {
    public static void main(String[] args) {
        
        Dog dog = new Dog();
        System.out.println(dog instanceof Dog);
        System.out.println(dog instanceof Pet);
        System.out.println(dog instanceof Object);
    }
}

 

 

 

 

1.1 总结

 

多态的好处:

 

提高了程序的可拓展性和可维护性

 

 

 

多态三种表现形式

 

[1] 父类引用子类对象

 

[2] 父类作为方法形参

 

[3] 父类作为方法返回类型

 

 

 

多态发生的条件

 

[1] 必须有继承

 

[2] 有重写/实现

 

[3] 父类引用子类对象

 

 

 

多态过程中,需要调用子类特有的方法

 

类型转换/instanceof

 

 

 

多态的分类(C)

 

编译时多态:重载

 

运行时多态:多态,具体到运行时才知道父类对象引用的是哪个子类。

 

 

 

思考题:java是如何实现运行时多态?

 

动态绑定和静态绑定

 

 

 

1.2 调试技巧

 

断点:程序执行时的停止的点。

 

step over: 单步执行。执行一句当前的代码

 

step into: 进入方法体继续执行。

 

 

posted @ 2019-05-06 15:06  ___mouM  阅读(223)  评论(0编辑  收藏  举报