Java学习笔记十一(面向对象三大特性之多态)

感觉多态是面向对象比较难理解的一个点了,尤其是向上和向下转型那里,希望整理之后能有一个更清晰的理解~


1、 生活中的多态: 同一种行为,作用于不同的对象,会产生不同的结果。比如说人走路的行为,不同的人会有不同的走路姿势和习惯。

      程序中的多态: 同一个消息,作用于不同类的对象,会产生不同的响应(调用的是不同的函数内容)

2、 多态的必要条件: (1)满足继承关系

                                  (2)子类重写父类方法

                                 (3)  父类引用指向子类实例(Animal a1 = new Cat() Animal a1是父类的引用,new后指向的是子类的实例)

                                  (4) 动态绑定或静态绑定

3、 多态的种类:   (1) 编译时多态(也称设计时多态、静态绑定、前期绑定),多靠方法重载实现。

                             (2) 运行时多态(也称动态绑定,后期绑定),Java虚拟机根据调用该方法实例的类型来决定调用哪个方法,多靠方法重写实现。使程序的可扩展性达到极致。

4、绑定的含义:  把一个方法同这个方法所在的类型联系在一起,JVM选择运行哪个类型那个方法。

5、Java多态 = 向上转型 + 动态绑定

            向上转型: 父类对象引用指向子类实例,自动转型(不需要强制类型转换)

            动态绑定: 能识别出对象转型之前的类型,从而调用该类的方法。

            二者相辅相成。向上转型实现了将子类对象向上转型到父类,动态绑定针对的范畴只是对象的方法,如果是属性则会调用父类的属性。

            对于向上转型来说,可以理解为父类型变量指向了子类型的对象。在编译期间,看的是变量的类型(即父类的类型,属性是静态绑定到变量上的,谁调用就是谁的),而在运行期间,看的是对象的类型(方法是动态绑定到对象上的)。这也更好的解释了上面加粗的句子的含义。

6、向下转型: 父类的引用变量,赋值给子类的引用变量

        (1) 实现方法:由于向下转型不能自动转型,所以需要强制类型转换时,但是单纯的强转可能会出现ClassCastException,所以采取以下方法进行强转(兄弟类型之间是不能强转的哦):

                       Animal a1 = new Dog();

                       if(a1 instanceof Dog){

                             Dog d1 = (Dog)a1;

                       }

                       //instanceof 是判断对象类型是否匹配(左边的对象是否为右边类的实例),当a1是Dog类是,进行强制类型转换,是安全的方式。因为a1本来就指向Dog类的对象,所以Dog类的实例d1也可以指向a1,即指向了Dog类的对象,调用Dog类的方法。

             (2)向上和向下转型的注意事项:

                         向上转型之后,子类只能调用父类的方法,或者重写父类的方法,而不能调用子类独有的方法。

                向下转型之后,子类可以调用自己独有的方法。

7、 抽象的不能代替具体的,具体的可以代替抽象的。

       白马非马   白马是具体的,马是抽象的,白马是不能代替马的。

8、 为什么说多态将可扩展性达到极致呢?

       每增加一个对象,你都要在方法里面增加一段判断这个对象到底属于哪个类里面的代码,然后才能执行这个对象相应的方法。即每增加一个新的对象,都要改变方法里面的处理代码,而现在,你不需要再改变方法里面的处理代码了,因为有了动态绑定。你要增加哪一个对象,你在实现当中把这个对象new出来就完了,不再用去修改对象的处理方法里面的代码了。


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值