读书笔记《Thinking in Java》-第一章-07/10/14
16、对于非面向对象的编程,它产生的函数调用会引起“前期绑定”。编译器产生对一个具体函数名字的调用,而连接器将这个调用解析到将要被执行的代码的绝对地址。相反地,在面向对象编程中采用了“后期绑定”,当对象发送消息时,被调用的代码直到运行时才能被确定。为了执行后期绑定,Java采用一段特殊的代码来替代绝对地址调用。这段代码使用在对象中存储的信息来计算方法体的地址。
(多态,或者说是向上转型。他忽略了类型的具体细节,仅仅和基类交互。这很符合我们人类的思维习惯,比如你会开车,那么给你一辆奔驰你肯定能开,宝马也可以。只需说我在开车,而不必说我在开奔驰开宝马。当然你可以这么说,炫耀一下也不是错^_^,Java允许你这么做。)
17、(继承就是对接口的复用,既然我们只想复用接口,那么干脆就创建接口,用接口去操作具体对象。接口优于抽象类。)
18、Java对象是在堆中创建的,也就是动态的方式。这种动态的方式牺牲了效率,但是带来极大的灵活性,这种灵活性正是解决一般化编程问题的要点所在。Java的垃圾回收机制,可以自动发现不会再被使用的对象,并继而销毁它。这种方式减少了需要考虑的议题和必要编写的代码。更重要的是垃圾回收器提供了更高层次的保障,可以避免暗藏的内存泄漏问题。(这个问题使得许多的C++项目折戟沉沙)。
19、容器是一种持有其他对象引用的新的对象类型,这些对象本身并不在容器中,仅仅是引用。容器有多种多样的,因为需要是多种多样的,所以根据需要在已知的容器中选用合适的容器类型就可以了。这些容器提供了相应的方法来处理其中引用的对象,如排序、查找、存入、取出等。
迭代器是一种选取容器中的元素,并把它呈现给用户的对象。迭代器提供了一种抽象,把容器的细节从访问容器的代码中分离出来。容器通过迭代器被简单地抽象成为一个序列。就是说,你可以遍历整个序列,而不用担心底层结构。
(这些容器就是很通用的数据结构和算法的有机集合。)
20、对容器的选择:不同的容器提供了不同的接口和外部行为;不同的接口对于某些操作具有不同的效率。如:ArrayList和LinkedList具有相同的接口和外部行为。而ArrayList随机访问元素的时间是固定的开销,LinkedList则是需要在列表中移动的,代价比较高昂,不适合做大量的随机访问。基类List和迭代器所带来的抽象,把容器之间进行转换时对代码产生的影响降低到最小限度。
(所以,新建容器要这样:List alist = new ArrayList();)
21、Java的单根继承结构好处很多,这里就不罗嗦了。
22、除非确切地知道所要处理的对象的类型,否则向下转型几乎是不安全的。
(向上转型就是把马当作动物处理,马具有动物的所有特性,所以是绝对安全的。向下转型就是把动物当作马处理,马吃草是毫无争议的,但是动物吃草就不行了,因为狮子老虎会不高兴的:“俺可不是吃素的!”,危险就在这里。)
23、关于泛型:我看的是《Thinking in Java》第三版,使用的是j2se1.4,而此时j2se1.6都面世了。Java发展的非常迅速,早已经支持泛型了。此处的论述已经过时了,概不讨论了……
24、异常处理。Java的异常处理机制是非常优秀的,异常不能被忽略,所以他保证一定会在某处得到处理。
(程序的健壮性是衡量程序质量的很重要的指标,不堪一击的程序会出点错误就只能中止退出,可以回忆一下win98时代可怕的蓝屏噩梦,看到蓝屏是什么感觉呢?如果我很富有,一定会砸掉电脑,换上苹果的。程序的健壮性如同人,要要经得起打击,犯点错误是难免的,改正就是了,千万不要自暴自弃,开除自己的地球球籍啊……)
25、并发性。多线程最常见的就是用户界面。通常线程是一种为单一处理器分配时间的手段。如果机器有多个处理器,那么程序不需要特殊调整也能执行得更快。Java的线程机制是内置的。