Java编程思想读书笔记1——对象导论

一、概论

    本章介绍的是背景性的和补充性的材料,将会引入很多面向对象的概念,从而了解到面向对象的重要性,以及如何使用对象进行设计

二、摘抄与短评

1.我们之所以将自然界分解,组织成各种概念,并按其含义分类,主要是因为我们是整个口语交流社会共同遵守协定的参与者,这个协定以语言的形式固定下来……除非赞成这个协定中规定的有关语言信息的组织和分类,否则我们无法交谈。

短评:这种规则最基本的一点,就是给大自然的万物予以名称,当我们都遵守了这个规则,才能进行有效沟通。

2.Alan Kay提出第一个成功的面向对象语言Smalltalk的五大基本特性:万物皆为对象,程序是对象的集合,每个对象都有自己的有其他对象所构成的存储,每个对象都有其类型,某一特定类型的所有对象可以接受同样的消息。Booch对对象提出了一个更加简洁的描述:对象具有状态、行为和标识。

短评:smalltalk的五个基本特性很好地向我们展示了面向对象编程设计方式,这几点也是Java所具备的。而Booch提出的关于对象的描述,我是这么理解的:状态,指的是对象的属性,用以表明对象的状态;行为,指的是对象产生的方法;标识,指的是每个对象在内存里都有唯一的地址。

3、实际上,在建立新类时,应该首先考虑组合,因为它更加简单灵活。如果采用这种方式,设计会变得更加清晰。一旦有了一些经验之后,便能看出必须使用继承的场合了。

短评:在接口开发过程中,返回给前端的VO往往采用组合的方式,将集合、DTO、属性等进行包装组合;而继承一般用于抽取出具有共同特征的对象作为基类,从基类中导出其他类型,来表示此基类所代表的核心概念的不同实现。

4、在处理类型的层次结构时,经常想把一个对象不当作它所属的特定类型来对待,而是将其当作其基类的对象来对待,这使得人们可以编写出不依赖于特定类型的代码。即使添加新的对象类型,也不会需要修改处理泛化的方法。

短评:这种设计很大程度提高了程序的扩展性,同时降低了软件维护的代价。

5、一个非面向对象编程的编译器产生的函数调用会引起所谓的前期绑定(静态绑定)。这么做意味着编译器将产生一个具体函数名字的调用,而运行时将这个调用解析到将要被执行代码的绝对地址。在OOP中,程序直到运行时才能确定代码的地址,所以当消息发送到一个泛化对象时,采用的是后期绑定(动态绑定)。Java使用一小段特殊的代码来代替绝对地址调用,这段代码使用在对象中存储的信息来计算方法体的地址,实现动态获取。

短评:在Java中,final、private、static修饰的方法以及构造函数都是静态绑定。在代码的编译阶段,编译器通过声明基类对象的类型(即引用本身的类型)在方法区中该类型的方法表中查找匹配的方法(最佳匹配法:参数类型最接近的被调用),如果有则编译通过;在代码的运行阶段,首先创建一个子类对象,在进行方法调用时,JVM会把它压入操作数栈,用它来进行调用。子类如果重写了基类的方法,则方法表中同名表项会指向子类的方法代码;若无重写,则按照基类中的方法表顺序保存在子类方法表中。

6、单根继承结构保证所有对象都具备某些功能,使得所有对象都很容易在堆上创建,并且参数传递也得到了极大简化;单根继承结构使GC的实现变得容易多了,不会出现无法确定对象类型而陷入僵局。

短评:不太理解为何单根继承结构使得对象在堆上更容易创建,所以查了在Java堆上创建对象的全过程,如下:


7、在JavaSE5之前,集合只能存储Object类型。当对象引用置入容器时,该对象向上转型为Object,因此它会丢失身份,当再把它取回时,就获得了一个Object类型。这个问题在JavaSE5得到了解决——增加了参数化类型,也就是向下转型,这使得编译器可以创建一个只接纳和取出特定类型的集合。

短评:向下转型存在危险,如果向下转型为错误类型,则会报运行时异常。此外,向下转型和运行时的检查需要额外的程序运行时间。

8、Java完全采用了动态内存分配方式,存储空间是在运行时被动态管理的,所以需要大量的时间在堆中分配存储空间,这可能要远远大于在堆栈中创建存储空间的时间。在堆栈中创建存储空间和释放存储空间通常各需要一条汇编指令即可,分别对应将栈顶指针向下移动和将栈顶指针向上移动。

短评:

9、对于允许在堆栈上创建对象的语言,编译器可以确定对象的生命周期,并可以自动销毁它。然而,在堆上创建对象,编译器不会知道它的生命周期。在像C++这样的语言中,必须通过编程方式来确定何时销毁对象,这可能会因为不能正确处理而导致内存泄漏。Java提供的垃圾回收器机制,可以自动发现不再被使用的对象,并自动释放其占用的内存。

短评:

10、可能在任意时刻都有成百上千的客户向服务器发送请求,所以任何小的延迟都会产生重大影响。为了将延迟最小化,程序员通常是分散给客户端机器处理,但有时也会使用所谓的中间件将负载分散给在服务器端的其他机器。

短评:


猜你喜欢

转载自blog.csdn.net/weixin_33656548/article/details/80190960