多态

来源:互联网 发布:淘宝卖家注册流程 编辑:程序博客网 时间:2024/04/30 05:03
一、概念:多种形态。
二、定义:父类的引用或者接口的引用指向子类或者实现类的对象。
三、三大步骤:
            1、new关键字:代表对象的实际类型不会发生变化。
            2、编译时多态:编译时看主观类型或者说是引用类型。
            3、运行时多态:运行时看实际类型。
四、一些术语:
    1、向上转型/向下转型:子类的引用赋值给父类的引用/父类的引用指向子类的引用。
五、局限性:
    1、只适合普通方法的调用
    2、不能调用属性
    3、静态方法不支持多态
    4、方法修饰符是private,不支持多态
六、多态的强转(接口的特殊性):
        1、父类的引用可以强转为子类的引用
        2、接口引用可以强转为任何类型的引用
        3、任何类型可以强转为接口的引用
        4、强转往往会骗过编译器,在运行时才会抛出异常
补充理解(应用):
        前提条件:一个动物的父类  猫狗猴蛇虎等子类。
        Class Animal{
            public void eat(){}
        }
        class Dog extends Animal{
            public void eat(){}
            public void eatBone(){}
        }
        例子:
            1、Animal animal = new Dog();//实际类型是Dog
            2、Dog dog = (Dog)animal;//强制类型转换
            3、Cat cat = (Dog)dog;//ClassCastException编译转换异常。
            4、animal虽然实际类型是dog,但在调用animal.eatBone()时,编译是不通过的,animal是主观类型,编译器指挥找到animal中的方法,实际方法是运行时才会找到的,换句话说,编译器要求在代码编写阶段,代码调用的是主观类型的方法,不能调用实际类型特有的方法。
            5、instanceOf、==、getClass()和equals()的区别
                (1)Dog insanceOf Animal 要求Dog所在的引用 是Animal所在引用的同类或者子类
                (2)BeforeDog == AfterDog 要求BeforeDog和AfterDog的引用指向的是同一个对象
                (3)BeforeDog.getClass() == AfterDog.getClass()          要求BeforeDog的类对象和AfterDog的类对象是一样的。常用来判别两个对象是否是同类。
                (3)BeforeDog.equlas(AfterDog)要求BeforeDog引用对象的内容和AfterDog引用对象的内容一致。
            6、屏蔽子类之间的差异(应用参数表和返回值)和子类统一调用
                //写些例子、加个链接
           
0 0
原创粉丝点击