读书笔记《Thinking in Java》-第一章-07/10/14

Posted on 2007-10-15 16:22 Raylong 阅读(1034) 评论(6)  编辑  收藏 所属分类: 读书笔记
读书笔记《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的线程机制是内置的。

Feedback

# re: 读书笔记《Thinking in Java》-第一章-07/10/14  回复  更多评论   

2007-10-16 13:40 by 翔南
恩 写的挺好的!
感觉自己的java基础貌似不是很扎实..

# re: 读书笔记《Thinking in Java》-第一章-07/10/14  回复  更多评论   

2007-10-16 14:46 by Raylong
@翔南
感谢回复,我也觉得在学过一段Java之后回过头来发现很多细节都忘记了,会犯一些低级错误。所以就有了置顶的那篇Java语法总结。

# re: 读书笔记《Thinking in Java》-第一章-07/10/14  回复  更多评论   

2007-10-16 22:18 by zhrb
17、(继承就是对接口的复用,既然我们只想复用接口,那么干脆就创建接口,用接口去操作具体对象。接口优于抽象类。)

关于这个,我觉得继承和接口是各有各的用途。并不存在接口就一定比抽象类好的这种说法吧。呵呵...

# re: 读书笔记《Thinking in Java》-第一章-07/10/14  回复  更多评论   

2007-10-17 19:25 by Raylong
@zhrb
这个是在effective Java中的第16条建议,作者是Java类库的作者之一,说话应该很有分量吧。但是我没有足够的实践经验,也体会不到接口的优越性。所以我也不是很理解的 呵呵

# re: 读书笔记《Thinking in Java》-第一章-07/10/14  回复  更多评论   

2007-10-18 11:58 by zhrb
看了一下java tutorial里面对接口的定义,底下附1:借口是抽取相互之间没有关系的类的共同特征,而不用去关注类之间的关系。
我觉得这个是借口和抽象类最关键的区别,接口是希望一组没有层次关系的类之间可以拥有共同的行为,而抽象类作为父类的话,自然希望其子类在逻辑上和父类是有一定的关系的。比如说一个抽象类,鸟,可以飞。我们现在想设计一架飞机也可以飞,虽然我们可以让飞机这个类继承自鸟这个抽象类,但是这两个完全是风马牛不相及的东西,自然不应该有继承关系了。但如果是接口设计的话,我们可以设计出一个flyable的接口,里面定义fly的方法,因为鸟和飞机都可以飞,所以我们可以让鸟和飞机类去implement这个flyable的接口。
java tutorial还有一个例子,比如说商店有若干种商品,各种商品之间一般不会有什么继承关系,但是现在店主希望管理各种商品,所以店主希望所有的商品都实现一种可以称为管理的接口,里面包含用于管理的一些方法和属性,如价格、索引号这样的属性或者设置零售价格这样的方法。这样接口就巧妙的将各种不相关的类联系起来了。所以接口给编程以极大的灵活性。
Java中还有一些常用借口,比如说comparable接口,任何类只要实现了这个接口,都可以被compare。(好像是这样,不确定,有错请指出)
不过附3,看不太懂,是什么意思。大家交流一下

附:You use an interface to define a protocol of behavior that can be implemented by any class anywhere in the class hierarchy. Interfaces are useful for the following:

1.Capturing similarities among unrelated classes without artificially forcing a class relationship
2.Declaring methods that one or more classes are expected to implement
3.Revealing an object's programming interface without revealing its class
4.Modeling multiple inheritance, a feature of some object-oriented languages that allows a class to have more than one superclass
@Raylong

# re: 读书笔记《Thinking in Java》-第一章-07/10/14  回复  更多评论   

2007-10-26 11:00 by Matthew Chen
你可以使用接口作为一种行为的协议,它可以实现自继承层次中的任何类(也就是它可以是任何派系)。
1.在没有关联的类之间保留相似性而不依赖类的(继承)关系。
2.声明多个类(它们多半是平行的,没有继承关系)中期望实现的方法。
3.展现一个对象的编程接口而不是它的类。(面向接口编程,ruby中的duck type的思想解释得很形象)
3.建立多继承模型,一种在一些oo语言中允许的一个类有多个父类的特性。

只有注册用户登录后才能发表评论。


网站导航: