1.Introduction to Objects

 

1 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++?
。。。。。。。。
 
 
Summary
..................
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值