Java开发网 Java开发网
注册 | 登录 | 帮助 | 搜索 | 排行榜 | 发帖统计  

您没有登录

» Java开发网 » Java SE 综合讨论区  

按打印兼容模式打印这个话题 打印话题    把这个话题寄给朋友 寄给朋友    该主题的所有更新都将Email到你的邮箱 订阅主题
flat modethreaded modego to previous topicgo to next topicgo to back
作者 Thinking In JAVA学习笔记
wpszying





发贴: 3
积分: 0
于 2006-10-23 11:29 user profilesend a private message to usersearch all posts byselect and copy to clipboard. 
ie only, sorry for netscape users:-)add this post to my favorite list
最近开始使用 Thinking in Java 英文第三版开始学习Java。最主要的目的是提高计算机英语水平;学习java技术倒是其次,以后靠java吃饭的可能性也不大。
第一次对学习的计算机教材记笔记,这里贴出来,主要希望大家给点意见。因为主要是为了学英语嚒,所以有点像流水帐,与原文的段落一致,非难点的段落也有摘录。

第一章. Introduction to Objects

The progress of abstraction:
编程归根结底使用计算机语言解决现实世界中的问题,人所作的工作就是将现实中的问题进行抽象,得到能够被计算机“理解”的模型(这个模型是对实际问题的一种映射)。
由于计算机只能理解当前其支持的计算机语言,所以在对实际问题进行模型化、抽象化的过程中,必需要趋向一种选定的语言;/**??程序设计语言(包括汇编,甚至机器语言)都是对计算机作为一种电子机器的抽象、且每种语言抽象层次有高有低,可不可以理解为使用抽象层次高的语言,语言会作很多抽象的工作,人的抽象工作就对应减少??**/

自己的一点想法,需要验证:使用程序设计语言进行编程,实质上就是对问题建模、抽象,对计算机建模,直到二者对应的模型可以“连接”到一起,进行交互,对问题建模多一点,机器建模就可以少一点,二者是此消彼长的关系。如果程序设计语言的层次比较高,那么编程过程中人的工作就少而简单。

面向对象语言(如java)在对计算机的抽象上更进一步,这使得人可以在对现实问题的建模中进行更少的抽象活动。面向对象程序设计实际使用对象,消息等概念模拟现实世界中的元素和关系,使用oop的过程实际就是模拟现实世界中的一个实际过程的子集,所以阅读面向对象解决方案的时候,给人感觉就像在读其解决的问题的描述。

与现实世界中一样,每个对象是独一无二的。面向对象编程的主要任务是创建抽象数据类型(类),使用类的实例模拟现实世界中的元素交互倒是其次。相应地,oop编程人员通常可以分为两类:类的设计者,类的使用者。

任何程序设计语言都有一些基本类型,用来表示机器中的存储单元。与一些面向过程编程语言(如C)不同的是,使用oop可以通过添加新的数据类型来适应不同的问题,通过添加新的数据类型(也就是类class),编程人员可以扩展使用的oo语言。
/**当你把世界上所有现存的事物和概念都映射成类,如果可能的化,你得到就是一个静止地新世界了 ^_^。  **/

All program is a simulation of the system you’re designing

Once a class is established, you can make as many objects of that class as you like, and then manipulate those objects as if they are the elements that exist in the problem you are trying to solve. Indeed, one of the challenges of object-oriented programming is to create a one-to-one mapping between the elements in the problem space and objects in the solution space.
//**简单地将问题域的元素一对一映射为solution域的元素应该算不得面向对象的最高心法吧,难道适当的时候去芜存菁、融会贯通不是更加高明?? **//

An object has an interface
The requests you can make of an object are defined by its interface, and the type is what determines the interface.   
//**在本章的很多段落中可以看出,类别(type)和接口(interface)是一一对应的,一组接口唯一确定了一个type,而接口由定义了该类的对象能够响应的(请求)消息。
从这点也能看出java的编程语言本质――无论这种语言的抽象层次多高,包含的哲学思想多么先进,它也只是一种计算机语言,是计算机语言必定有很强的局限性。你瞧:它也始终是以某种事物能够提供的功能(或者叫服务)来标识该事物的存在的。**//

A type has a method associated with each possible request, and when you make a particular request to an object, that method is called.

An object provides services
从软件工程角度来讲,对象是用来提供服务的,这个点非常重要。程序是为用户提供服务,这个服务归根结底是程序中的对象提供的,所以如何进行功能的指派、对象的管理、程序流程的优化等等等等,就显得非常重要,这又不单单是这本书能够包含的了,头痛啊。。。。。。

The hidden implementation
The goal of the class creator is to build a class that exposes only what’s necessary to the client programmer and keeps everything else hidden.
访问控制(access control)的两个理由:
1.  控制访问:阻止对不希望被修改或被访问的成员的访问。
2.  类的设计者可以修改类内部的工作方式,不用担心影响类的使用者。
//**始终要记住一点:不违背语法!= 合适的,良好的。所有的语言(或者说计算机上的语言)都是有局限性的,它不能对所有东西进行控制**//

Reusing the implementation
。。。。。。

Inheritance : reusing the interface
注意区分java中的类(class)和类别(type)的概念,在thinking in java 中,只要是两个类的接口相同,那么它们的类别就一样,但是确不一定是同一个类。如在java的继承中,类A继承类B,那么A就从B复制了一份接口,A和B属于同一个type,但是显然不是同一个类。

Is-a vs. is-like-a relationships
使用java中的继承时,对子类接口处理的方式通常有两种:”is-a”方式 ,”is-like-a”方式.
在is-a方式中子类不增加新的接口方法,只是将父类中的方法重写(当然不重写方法也完全可以,但这样做没有任何意义),两者具有完全相同的接口;后者是在子类中添加新的接口方法,这样就改变了子类的接口,所以这种方式称为”is-like-a”方式。

Interchangeable objects with polymorphism
//**RR**//
Upcast概念是重点,对面向对象的初学者来说很难理解。

Abstract base classes and interfaces
什么时候需要抽象类:在某些设计中,你希望基类只提供给子类一个接口,这个时候可以使用抽象类。

Object creation, use & lifetimes
Technically, OOP is just about abstract data typing, inheritance, and polymorphism。
//**这句话看似恶俗,其实很精辟。对java语法的学习几乎都可以归结到上述几点。至于这些特性任何实现,编译器,解释器如何支持,实在不是当前能够掌握的内容。**//
程序中对象的创建和销毁有两种最常见的方式:动态(如java程序)和非动态(如c++程序)。前者动态地管理对象的创建和销毁,后者则按照实现指定的顺序进行。前者灵活性优先,而后者更注重效率。
Java是动态管理对象的语言,对象不是在编译的时候就创建(或者更准确地说,在编译的时候得到所有创建对象需要的信息),而是在程序运行时在堆(heap)中创建。这种动态管理对象的方式更倾向于认为:对象是很复杂的。因此在为对象寻找存储空间和释放存储空间上所付出的额外开销不会对整个对象的创建过程有太大的影响。并且这样做(动态管理对象)会给解决通用问题带来很大的灵活性。

Collections and iterators
容器,顾名思义就是一个包含多个其他对象的对象(也可以叫做collector,在java中容器被称为container)。可以通过称为迭代器(iterator)的对象来遍历访问或操作容器中的元素。Java中多数container在iterator的抽象下都可以简单理解成一个对象序列(sequence),迭代器提供了一种遍历某个序列而不考虑底层的结构的机制。

The singly rooted hierarchy
Java中类的继承结构中,所有的类都有一个最终的基类:Object .
在c++中,并没有一个作为所有类的最终父类的类存在。
其实除了c++外,大多数面向对象语言都有一个如java中Object类那样的最终基类。

Downcasting vs. templates/generics
//**RR Parameterized types的概念,优点??**//

Ensuring proper cleanup
程序运行过程中,每个对象都需要一定的资源(通常是指内存)。为了让程序正常运行,对资源的回收再利用非常重要,Java使用garbage collector(垃圾回收器)来进行这样的工作。
垃圾回收器知道对象是否依然有用(即是否有引用指向这个对象),如果没有对应的引用那么需要释放该对象占用的内存。

对于垃圾回收器如何工作,这里并没有详细的解释,只有一句吊人胃口的话:
垃圾回收器使用了对象的两个特性:Java中所有的对象都是在堆中创建的;所有对象的类都继承自Object类。

Garbage collectors vs. efficiency and flexibility
。。。。。。。。。。。。

Exception handling: dealing with errors
关于Java中异常的几点描述:
在多数的变成语言中,对程序中出现的错误(异常)的处理通常是靠设计者的警惕和经验,而Java提供了语言级别的强制手段,强迫程序对某些异常进行处理 。
异常和错误不同,它是从出错处抛出的对象,被事先设计的专门用来处理该类型异常对象的异常处理器截获(catch)并处理。
异常处理与程序的正常执行路径是一条完全分离的路径。
在java中异常不能够被忽略,它必须在某处被处理。
Java内置了异常处理,你必须遵守。如果没有编写处理异常的代码,编译会出错。
异常处理并不是java或面向对象语言所特有,在oo出现之前它就存在。只不过,在java中,异常是一个对象。

Concurrency
The threading is supported on an object level, so one thread of execution is represented by one object.
Java提供了限制性资源锁定功能,它可以锁定任何对象所占有的内存(这也是种共享资源),同一时刻只能由一个线程使用它。其他类型的资源必须由程序员显示锁定。

Persistence
。。。。。。。。。。

Java and the Internet
。。。。。。。。。

The Web as a giant server
。。。。。。。。。

Client-side programming
。。。。。。。。。

Scripting languages

Java
Java allows client-side programming via the applet and with Java Web Start
可以使用Java中的applet和Java Web Start来进行客户端编程。
//**Applet可以看作一个Framework。不要把框架简单理解为一堆类,一个Framework至少是非常美妙的一堆类。**//

.NET and C#
一个简陋的类比,但能说明一点问题:Ms的.net平台相当与java虚拟机和java类库,而c#相当与java。

Security
对于客户端软件来说,安全性是一个首要问题。Java通过对applet进行限制来提供安全性,applet就像是运行在“沙箱”中,它不能访问文件系统,也不能访问自己以外的内存。

与Java的“从根本上阻止安全问题发生”不同,微软使用了某种“信任机制”:
微软的ActiveX却几乎没有什么限制,它可以做很多事情。微软使用数字签名来解决可能存在的安全性问题,它建立在这样的概念之上:用户通过程序的数字签名来标识一段程序,并且用户自己承担运行程序的后果。数字签名的机制并没有完全解决恶意程序可能对系统造成的损伤,如一个有可信数字签名的代码依然可能包含破坏性的代码。

public-key encryption与ms的数字签名概念类似,通过它可以运行确定来源的applet,并是程序“跳出沙箱”。

Internet vs. intranet
。。。。。。。

Server-side programming
。。。。。。。。。。

Applications
。。。。。。。。。

Why Java succeeds
。。。。。。。。。。。。

Systems are easier to express and understand
Classes designed to fit the problem tend to express it better. This means that when you write the code, you’re describing your solution in the terms of the problem space (“Put the grommet in the bin”) rather than the terms of the computer, which is the solution space (“Set the bit in the chip that means that the relay will close”). You deal with higher-level concepts and can do much more with a single line of code.

Maximal leverage with libraries
。。。。。。。。。。。

Error handling
。。。。。。。。。

Programming in the large
。。。。。。。。。

Java vs. C++?
。。。。。。。。


wpszying edited on 2006-10-23 11:33


话题树型展开
人气 标题 作者 字数 发贴时间
9655 Thinking In JAVA学习笔记 wpszying 6517 2006-10-23 11:29
8532 Re:Thinking In JAVA学习笔记 liangx 129 2006-10-23 13:09
8031 Re:什么理论?为了学英语而学JAVA至于吗? softbb 22 2006-10-25 19:45
7780 Re:Thinking In JAVA学习笔记 BlueWaves 60 2006-11-07 22:09
7877 Re:Thinking In JAVA学习笔记 dejinzhao 19 2006-11-08 01:52
7903 Re:Thinking In JAVA学习笔记 carefreegale 54 2006-11-08 15:41

flat modethreaded modego to previous topicgo to next topicgo to back
  已读帖子
  新的帖子
  被删除的帖子
Jump to the top of page

   Powered by Jute Powerful Forum® Version Jute 1.5.6 Ent
Copyright © 2002-2021 Cjsdn Team. All Righits Reserved. 闽ICP备05005120号-1
客服电话 18559299278    客服信箱 714923@qq.com    客服QQ 714923