think in java第八章多态 总结随笔
来源:互联网 发布:美妙天堂知里绘画图片 编辑:程序博客网 时间:2024/04/27 08:57
多态:基于继承的向上转型功能,允许同一种类型同一行为有不同的表现。
多态的优点:多态不但能够改善代码的组织结构和可读性,还能够创建可扩展的程序—即无论在项目最初创建时还是在需要添加新功能时都可以"生长"的程序。
多态的作用:消除类型之间的耦合关系。
再论向上转型
当父类的引用指向子类对象时,就发生了向上转型,即把子类类型对象转成了父类类型。举例:水杉是树的一种(树的子类),我们可以称水杉是树。
转机
public static void tune(Instrument i) {i.play(Note.MIDDLE_C);}
上面代码中tune()方法接受了一个Instrument引用。在这种情况下,编译器是怎么样知道Instrument引用指向的是A对象,而不是B对象或C对象。要解决这个问题需要了解绑定了。
绑定:将一个方法调用同一个方法主体关联起来。
前期绑定:程序在执行前进行绑定。
后期绑定:程序运行时根据对象的类型进行绑定,后期绑定也叫做动态绑定或运行时绑定。
Java中默认是动态绑定。特殊:static方法和final(private方法属于final方法)方法不存在多态性,不是动态绑定。
动态绑定好处:使得多态中的基类对象可以正确执行相应的导出类对象方法。
可扩展性:多态使得扩展新类型和扩展基类不会对已有代码(调用基类方法的代码)产生影响。它可以让程序员“将改变的事物与不变的事物分离开”。
不可以覆盖private方法。子类是否会覆盖父类方法,按照子类是否可以访问到父类该方法来决定是否可以覆盖。
域与静态方法:多态特性(动态绑定)只是针对方法的。域和静态方法不具有这种特性。
构造器和多态
构造器是隐式static方法,所以不具有多态特性。
构造器的调用顺序:(其实这个知识点在之前已经有提到了)
用例:
package test;class Dog {public Dog() { System.out.print("汪汪");}}class Cat {public Cat() { System.out.print("喵喵"); }}class Mouse {public Mouse() { System.out.print("滋滋"); }}class Animal {public Animal() {System.out.print("动物"); }}class Bird extends Animal {public Bird() { System.out.print("鸟"); }}class Sparrow extends Bird {public Sparrow() {System.out.print("麻雀");}}public class test extends Sparrow {private Dog dog = new Dog();private Cat cat = new Cat();private Mouse mouse = new Mouse();public test() { System.out.print("吱吱"); }public static void main(String[] args) {new test();}}答案:动物鸟麻雀汪汪喵喵滋滋吱吱
基类的构造器总是在导出类的构造过程中被调用,而且按照继承层次逐渐向上链接,以使每一个基类的构造器杜能得到调用。
继承与清理:通过组合和继承方式创建新类时,通常情况都是不需要担心对象的清理问题,子对象通常都会留给垃圾回收进行处理。
如果确实需要做清理时,必须非常小心谨慎:在使用完之后按照创建逆序清理,即sub.dispose()然后super.dispose()来清理。
构造器内部的多态方法行为:
在调用子类构造器的过程中,会先调用父类构造器,此时子类构造器还没调用完成,子类对象也没有执行初始化,如果在父类构造器里调用多态方法,那么这个方法是可以产生多态行为特征的,但是由于子类构造器没有执行完,因此子类的初始化还没完成,多态方法里对子类成员变量的获取只能拿到默认值0,false,null。
总结
多态意味着“不同的形式”。在面向对象的程序设计中,我们持有从基类继承而来的的相同接口,以及使用该接口的不同形式:不同版本的动态绑定方法。
- think in java第八章多态 总结随笔
- Think in java 第一章 总结随笔
- Think in java第二、三章 总结随笔
- think in java第五章 初始化与清理 总结随笔
- think in java第六章 访问权限控制 总结随笔
- think in java第七章 复用类 总结随笔
- think in java第九章接口 总结随笔
- think in java第十章内部类 总结随笔
- think in java 第十三章字符串 总结随笔
- think in java 第十五章 泛型 总结随笔
- think in java第十六章数组 总结随笔
- think in java 总结
- Think in java第八章笔记
- Think In Java第八章 多态
- think in java 学习总结
- think in java 隐藏实施过程总结
- [think in java2]java并发问题总结
- think in java 读书笔记
- 目录菜单树的实现及查询
- leetcode--4. Median of Two Sorted Arrays
- xuptoj 1476快速幂(演示用):
- Win7下U盘安装Ubuntu16.04系统,并且配置登录校园网,亲测可行
- JavaScript模式之第2章总结
- think in java第八章多态 总结随笔
- dump stack(back trace)
- Ubuntu 14.04 R上安装rJava包出错问题的解决: error: unable to load shared object (rJava.so)
- 【opencv+OpenMP】OpenMP并行编程应用—加速OpenCV图像拼接算法
- 什么是node
- Fatal error: cannot create 'R_TempDir'
- JSP标签指令
- 微信accetoken获取的几种方式
- Linux三剑客之awk命令详解