java 多态

课堂笔记
1.接口
    1.1 什么是接口
        interface
        接口是一种行为规范
        从语法上讲:接口是一种特殊的抽象类(初期理解)
            这种特殊的抽象类中 
            所有的方法都是抽象的
            所有的变量都是常量
        从功能上讲:接口表示一种约定或者能力

     继承 "is...a" 的关系 是不是
     实现 "has...a"的关系 有没有
     语法:
        [访问权限修饰符] interface 接口名{
            
        }
     接口中的成员修饰符是固定的
        成员方法 ---> 都是抽象的 都是公有的 public abstract
        成员变量 ---> 都是常量 公有静态常量 public static final
    1.2 接口的特点
        1.类与类之间的关系 叫做 继承 extends
            类是单继承 一个儿子只能有一个爹
          类与接口之间的关系 叫做 实现 implements
                一个类 可以同时实现多个接口 接口与接口之间用逗号分隔 一个儿子可以有多个干爹
        2.类在继承一个类的同时 还可以实现多个接口
            弥补了java类之间单继承的不足 提高了代码的扩展性
        3.在java中 接口与接口之间也有关系 接口继承接口 一个接口可以同时继承多个接口
        4.接口不能用于实例化对象 接口中没有构造方法
    在项目中使用接口的意义
        例如
            abstract 人类{
                abstract void eat();
                void 搞对象(){
                }
                //abstract void 开小卖店();
            }
            公务员 extends 人类 interface 搞副业,参加竞选{
                void eat(){
                    四菜一汤
                }
            } 
            公务员 开小卖店
            interface 搞副业{
                abstract void 开小卖店();
            }
            interface 参加竞选{
                abstract int 拉票();
            }

            将主要的功能设计为类
            将功能的扩展设计为接口
            在完成主要功能的基础上
            哪个类需要进行功能的扩张 实现功能接口即可

            鸟 类
            飞机 类 
            
            飞

            鸟 extends 恐龙 implements 飞
            飞机 extends 机械 implements 飞

        抽象类 和 接口的区别
            1.抽象类 使用abstract修饰 接口使用interface声明
            2.抽象类中可以包含非抽象的方法 也可以包含抽象方法
              接口中所有的方法都是抽象的
            3.抽象类 和 接口都不能被实例化
                抽象类中构造方法
                接口中没有构造方法

2.多态
    2.1 什么是多态
        定义: 事物存在的多种体现形态

        美女 extends 人类
        
        美女 范冰冰 = new 美女();
        人 范冰冰 = new 美女();

        超人 extends 人类
        超人 麦克 = new 超人();
        人 麦克 = new 超人();

        new的这个实体 即具备美女的特征 也具备人类的特征
        但是这种写法 必须有个前提条件 就是美女必须是人的子类
        
        当类与类之间产生关系
        那么这个实体除了具备自己的类型 还具备了其他类型
        这个事物就存在了多种形态--->多态

        打印机 类 打印功能
          彩色打印机 ---> 打印彩色
          3D打印机 ---> 打印3D

          彩色打印机 cd = new 彩色打印机();
          打印机 cd = new 彩色打印机();
        java中的多态有两种体现形式
            1.方法的重载 就是方法的多态性体现
            2.对象的多态性
            
    2.2 多态的前提****
        1.类与类/接口之间存在着关系 要不就是继承 要不就是实现
        2.子类重写父类方法
        3.父类引用指向子类对象
                Animal a = new Dog(); 
    2.3 对象的向上转型 和 向下转型
        向上转型
            Animal a = new Dog(); 
            子类对象 赋值给 父类引用 会自动将子类对象的类型提升为父类类型
            语法:
                父类类型 引用名 = new 子类类型();
            特点:
                此时该引用 只能调用父类中的属性和方法
                不能调用子类特有的属性和方法
        向下转型
            将父类引用 强制 转为子类类型的过程
            语法:
                子类类型 引用名 = (子类类型)父类引用;
            特点:
                1.此时该引用可以调用子类特有的方法 同时还可以调用从父类继承过来的方法
                2.在进行向下转型之前 一定要用 instanceof运算符 进行判定
                    否则容易出现"ClassCastException"类型强制转换异常
                语法:
                    对象 instanceof 类型
                    结果是 boolean类型
                        true 对象属于指定类型
                        false 对象不属于指定类型
    2.4 多态的应用以及注意事项
        在多态中
        父类引用指向子类对象时
            成员方法调用的特点:
                编译看左边 运行看右边
                    在编译时期 参阅引用变量所属的类型中是否有调用的方法
                        如果有 编译通过
                        如果没有 编译不通过
                    在运行时期 参阅对象所属的类中是否有调用的方法
                        如果有 就调用
                        如果没有 就调用父类的
                在堆内存中 在创建子类对象的同时 包含父类的内容 "你的是我的 我的还是我的"

                成员方法 动态绑定(根据对象的实际类型确定执行哪个方法)
            成员变量的特点:
                编译看左边 运行看左边
                成员变量 不具备多态性 通过引用变量来访问其包含的实例变量
                当父类 子类 出现重名变量的时候 多态状态下 看的是父类
                因为在创建子类对象时 堆内存中其实有两个变量
                一个是父类的num 一个是子类的num
                当你拿父类的引用 去找num的时候 他就找到他自己的

                成员变量(属性) 静态绑定(只根据当前表示类型决定使用哪个变量)
                不存在重写 父类中已经有属性了 就不再去找子类中的
            静态成员方法:
                编译看左边 运行看左边
                静态绑定(与类相关 与对象无关)
    2.5 多态的好处和弊端
        多态的好处:
            提高了程序的扩展性
            作用主要体现在 方法的形参列表上
                被继承的类 /被实现的接口 当做形参传递 可以接收任意子类(实现类)对象
        多态的弊端:
            虽然提高了程序的扩展性
            但是只能使用父类的引用访问父类中定义的成员
            不能直接访问子类特有的属性和方法 想要访问 必须向下转型

你可能感兴趣的:(Java学习)