《Java编程思想》(第二版)第7章:多态(polymorphism)

编程

封装,继承与多态是OOP的三个核心本质。
Method-call(函数调用)绑定方式:
如果绑定动作发生于程序执行前(由编译器和连接器完成),成为"先期绑定(early binding)"
绑定动作将在执行期才根据对象型别尔进行,称为后期绑定late binding,或者执行期绑定run-time binding,或者动态绑定dynamic binding.
Java运用RTTI(run-time type identification)技术来支持动态绑定.

上一章提到的final关键字修饰函数有两个作用:1是从设计上考虑禁止该method被覆盖,2是从效率上考虑告诉编译器可以"关闭"动态绑定,于是编译器便得以为final method call产生效率较佳的程序代码.不过大多数时候这么做并不会为你的程序带来整体效能提升.所以最好还是处于设计上的考虑来决定是否使用final,而不要企图用final来改善效率.

override与overload在语法上只有微小的差别,但是语义上却108000里.一定要注意不要疏忽写错了.如果这个问题被埋藏于大型程序中,找出这个问题的难度可想而知有多高!

abstract关键字:为了产生共同接口或者禁止生成base class的实例,可以使用抽象类.
含有abstract methods(抽象函数)的类称为abstract class.如果class含有单一或多个abstract methods,便需要以关键字abstract作为这个class的修饰词.否则编译器会发出错误信息.

我们也可以将不含任何abstract methods的class声明为abstract.如果你不希望你所撰写的class被产生出任何实体,但这个class又不具备"拥有abstract methods"的实际理由时,这项性质便极为有用.

构造函数(Constructors)和多态(polymorphism)
在某个对象生成的时候整个继承链上的构造函数都会被调用到,否则整个对象便无法建构成功.

继承与finalize()
当你使用组合技术来写新的class,你不需要烦恼他的成员对象的终止(finalizing)问题.每个成员都是独立对象,因此会被垃圾回收器回收并终止.不过在继承关系中,如果你有某些特别的清理动作(cleanup)得在垃圾回收时候进行,你就得在derived class中复写finalize(),同时千万别忘了调用base class的finalize().即super.finalize().

plymorphic mehtods在构造函数中的行为
--是很难预料的:)动脑想一想吧.这里是臭虫多产地带.而就观念而言,构造函数的任务是让对象从无到有(这很难被视为一般性工作).因此,撰写构造函数时,一条原则是:"尽可能简单地让对象进入正确状态.如果可以的话,别调用任何函数".构造函数中唯一可以安全调用的函数便是"base class中的final 函数"(这对private 函数来说一样成立,因为他们天生就是final).此类函数无法被复写,也就不会产生含混不清的问题了.

纯粹继承(pure inheritance) vs. 扩充(extension):
IS-a vs. IS-like-a

向下转型(downcasting)与RTTI
RTTI比单纯的转型包含了更多内涵.举例而言:有个方法可以让你在尝试向下转型之前,先取得你所处理的型别.

貌似前面的章节有提到:成员函数不许调用构造函数,现在构造函数对成员函数的调用上我们也尽量加以限制了....

--------------------------------------------------------------------------------

时间: 2024-11-08 17:55:43

《Java编程思想》(第二版)第7章:多态(polymorphism)的相关文章

java编程思想-java编程四线第二十一章 线程SynchronizationComparisons.java有错误

问题描述 java编程四线第二十一章 线程SynchronizationComparisons.java有错误 //BaseLine 和AtomicTest 是线程不安全的 ,求解答 //: concurrency/SynchronizationComparisons.java// Comparing the performance of explicit Locks// and Atomics versus the synchronized keyword.import java.util.c

java-关于JAVA编程思想中synchronized和ReentrantLock

问题描述 关于JAVA编程思想中synchronized和ReentrantLock 在学习JAVA编程思想并发一章时,关于synchronized和ReentrantLock的例子运行 结果与书中不一致.代码如下: package thinking.in.java.chapter21; class Pair { private int x,y; public Pair(int x, int y) { this.x = x; this.y = y; } public Pair() { this(

关于继承内部类——java编程思想示例程序分析

编程|程序|继承|示例 关于继承内部类--java编程思想示例程序分析:class Egg2 { protected class Yolk { public Yolk() { System.out.println("Egg2.Yolk()"); } public void f() { System.out.println("Egg2.Yolk.f()"); } } private Yolk y = new Yolk(); public Egg2() { System

学习JAVA编程思想4的好方法

问题描述 跪求大神总结学习JAVA编程思想4的好方法. 解决方案 解决方案二:Java编程思想是很好的学习Java的材料,但对初学者来说有的地方不是能够轻易明白的.因为Java涉及的概念和技术非常广泛,建议先把基础夯实,比如类,接口,继承,多态等,这些有了基础后可以再深入学习正则表达式.线程.io等,一定要动手编写代码,并确实明白代码的执行逻辑.解决方案三:1.背把那些死知识背下来,复习巩固2.敲可以按书本例子课后题敲,对没掌握的可以重复敲3.测找其他题测试掌握情况,最好找SCJP题库的题,因为

java编程思想动态代理实现事务

问题描述 各位大侠好,最近在研读Java编程思想,在看到动态代理这块的时候遇到一点问题,是一个课后习题.大概是这样的:使用动态代理来编写一个系统以实现事务,其中,代理在被代理的调用执行成功时(不抛出任何异常)执行提交,而在其执行失败时执行回滚.你的提交和回滚都针对一个外部的文本文件,该文件不再Java异常的控制范围内.你必须注意操作的原子性.感觉这道题很有意义,但是由于是新手,自己在读题和解题的时候都比较困惑,所以希望各位达人能帮忙解答一下.最好有个完整的例子.小弟仅有的45分全部奉上! 解决方

java-求大神推荐几本关于Java编程思想的书

问题描述 求大神推荐几本关于Java编程思想的书 有时结果总是超乎自己的想象,可能是自己的思维模式跟不上计算机的算法 解决方案 建议你还是多做些联系,参与一些项目练练实际经验吧,看编程思想的书时需要一定基础的. 解决方案二: thinking in java 解决方案三: effective java

java多线程问题,java 编程思想书中的例子

问题描述 java多线程问题,java 编程思想书中的例子 在看java编程思想书中的多线程一节,书中对wait,notify,notifyall举了一个例子,模拟给汽车涂蜡和抛光的过程, 因为抛光任务在涂蜡之前是不能尽兴的,反之,涂蜡任务在涂另外一层蜡之前,必须要等抛光任务结束.代码如下: 显示一个汽车类: class Car{ private boolean wanOn=false; public synchronized void waxed(){ waxOn=true; notifyAl

关于java问题-java编程思想的23种设计模式有哪些

问题描述 java编程思想的23种设计模式有哪些 例如,单例设计模式其它就不知道了?可以的话在给个例子描述一下 解决方案 根据caozhy的提示,再整理一下 1. Memento(备忘录) 2. Chain of Responsibility(责任链) 3. Observer(观察者 4. Command(命令模式) 5. State(状态模式) 6. Interpreter(解释器 7. Strategy(策略模式) 8. Iterator(迭代子 9. Template Method(模板方

寻找java编程思想

问题描述 谁有第一版到最新版的java编程思想,能给我传下不,小弟在此谢过...有的话请传到zhhj0104@qq.com 解决方案 解决方案二:如果有的話我也想要啊解决方案三:我也想要..先谢谢了解决方案四:去作者网站.早期版本都是直接提供下载的.解决方案五:这破书就算了吧

Java编程思想重点笔记(Java开发必看)

Java编程思想,Java学习必读经典,不管是初学者还是大牛都值得一读,这里总结书中的重点知识,这些知识不仅经常出现在各大知名公司的笔试面试过程中,而且在大型项目开发中也是常用的知识,既有简单的概念理解题(比如is-a关系和has-a关系的区别),也有深入的涉及RTTI和JVM底层反编译知识.   1. Java中的多态性理解(注意与C++区分) Java中除了static方法和final方法(private方法本质上属于final方法,因为不能被子类访问)之外,其它所有的方法都是动态绑定,这意