第一章:对象导论
这一章主要是帮助我们了解面向对象程序设计的全貌,更多是介绍的背景性和补充性的材料。其实萌新应该跳过这一章,因为这章并不会去讲语法相关的知识,当然可以在看完这本书后续章节后,再来回看这一章,这样有助于我们了解到对象的重要性,以及怎样使用对象进行程序设计。
Alan Kay曾经总结了第一个成功的面向对象语言、同时也是Java所基于的语言之一的Smalltalk的五个基本特性,这些特性表现了一种纯粹的面向对象的程序设计方式:
万物皆为对象。理论上讲,你可以抽取待求解问题的任何概念化构件(狗、建筑物、服务等),将其表示为程序中的对象。
程序是对象的集合,它们通过发送消息来告知彼此所要做的。要想请求一个对象,就必须对该对象发送一条消息。更具体的说,可以把消息想象为对某个特定对象的方法的调用请求。
每个对象都有自己的由其它对象所构成的存储。换句话说,可以通过创建包含现有对象的方式来创建新类型的对象。
每个对象都拥有其类型。按照通用的说法,“每个对象都是某个类(class)的一个实例(instance)”,每个类最重要的区别与其他类的特性就是“可以发送什么样的消息给它”。
某一特定类型的所有对象都可以接受同样的消息。
第二章:一切都都是对象
用引用操纵对象
每种编程语言都有自己操作内存中元素的方式。有时候,程序员必须注意将要处理的数据是什么类型,你是直接操纵元素,还是用某种特殊语法的间接表示(例如C/C++里得指针)来操作对象?
所有这一切在Java里都得到了简化。一切都被视为对象,因此可采用单一固定的语法。尽管一切都看作对象,但操纵的标识符实际上是对象的一个"引用"(reference)。可以将这情形想像成用遥控器(引用)来操纵电视机(对象)。只要握住这个遥控器,就能保持与电视机的连接。当有人想改变频道或者减小音量时,实际操控的是遥控器(引用),再由遥控器来调控电视机(对象)。如果想在房间里四处走走,同时仍能调控电视机,那么只需携带遥控器(引用)而不是电视机(对象)。 此外,即使没有电视机,遥控器亦可独立存在。也就是说,你拥有一个引用,并不一定需要有一个对象与它关联。
存储到什么地方
程序运行时,对象是怎么进行放置安排的呢?特别是内存是怎样分配的呢?对这些方面的了解会对你有很大的帮助。有五个不同的地方可以存储数据∶
1)寄存器。这是最快的存储区,因为它位于不同于其他存储区的地方——处理器内部。但是寄存器的数量极其有限,所以寄存器根据需求进行分配。你不能直接控制,也不能在程序中感觉到寄存器存在的任何迹象(另一方面,C和C++允许您向编译器建议寄存器的分配方式)。
2)堆栈。位于通用RAM(随机访问存储器)中,但通过堆栈指针可以从处理器那里获得直接支持。堆栈指针若向下移动,则分配新的内存;若向上移动、则释放那些内存。这是一种快速有效的分配存储方法,仅次于寄存器。创建程序时,Java系统必须知道存储在堆栈内所有项的确切生命周期,以便上下移动堆栈指针。这一约束限制了程序的灵活性,所以虽然某些Java 数据存储于堆栈中–特别是对象引用,但是Java对象并不存储于其中。
3)堆。一种通用的内存池(也位于RAM区),用于存放所有的Java对象。堆不同于堆栈的好处是∶编译器不需要知道存储的数据在堆里存活多长时间。因此,在堆里分配存储有很大的灵活性。当需要一个对象时,只需用new写一行简单的代码,当执行这行代码时、会自动在堆里进行存储分配。当然,为这种灵活性必须要付出相应的代价∶用堆进行存储分配和清理可能比用堆栈进行存储分配需要更多的时间(如果确实可以在Java中像在C++中一样在栈中创建对象)。
4)常量存储。常量值通常直接存放在程序代码内部,这样做是安全的,因为它们永远不会被改变。有时,在嵌入式系统中,常量本身会和其他部分隔离开,所以在这种情况下,可以选择将其存放在ROM(只读存储器)中。
5)非RAM存储。如果数据完全存活于程序之外,那么它可以不受程序的任何控制,在程序没有运行时也可以存在。其中两个基本的例子是流对象和持久化对象。在流对象中,对象转化成字节流,通常被发送给另一台机器。在"持久化对象"中,对象被存放于磁盘上,因此,即使程序终止,它们仍可以保持自己的状态。这种存储方式的技巧在于∶把对象转化成可以存放在其它媒介上的事物,在需要时,可恢复成常规的、基于RAM的对象。java提供了对轻量级持久化的支持,而诸如JDBC和Hibernate这样的机制提供了更加复杂的对在数据库中存储和读取对象信息的支持。
第三章:操作符
本章的内容比较基础,主要讲了赋值、算数操作符、关系操作符、逻辑操作符、按位操作符、移位操作符、三元操作符等基础知识。本章只是记录下递增和递减的相关知识。
自动递增和递减
递增和递减操作符不仅改变了变量,并且以变量的值作为生成的结果。这两个操作符各有两种使用方式,通常称为前缀式和后缀式,对于前缀递增和前缀递减(假设a是一个int值,如++a或–a),会先执行运算,再生成值,而对于后缀递增和后缀递减(如a++或a–),会先生成值,在执行运算,下面是一个例子:
public class AutoInc {
public static void main(String[] args) {
int i = 1;
System.out.println("i: " + i); // 1
System.out.println("++i: " + ++i); // 执行完运算后才得到值,故输出2
System.out.println("i++: " + i++); // 运算执行之前就得到值,故输出2
System.out.println("i: " + i); // 3
System.out.println("--i: " + --i); // 执行完运算后才得到值,故输出2
System.out.println("i--: " + i--); // 运算执行之前就得到值,故输出2
System.out.println("i: " + i); // 1
}
}
总结:对于前缀形式,我们在执行完运算后才得到值。但对于后缀形式,则是在运算执行之前就得到值。
标签:存储,Java,思想,对象,编程,println,操作符,堆栈 From: https://www.cnblogs.com/LvJinshuai/p/16998350.html