Thinking in java 第二章 - 一切都是对象

如果我们说另一种不同的语言,那么我们就会发觉一个有些不同的世界。
                                                                                                                                                                                        ——Luding Wittgerstein (1889 ~ 1951)

尽管Java是基于C++的,但是相比之下,Java是一种更“纯粹”的面向对象程序设计语言。

1 用引用操作对象

每种编程语言都有自己的操作内存中元素的方式。
在Java中,一切都被视为对象。尽管一切都看作对象,但操纵的标识符实际上是对象的一个“引用”。而且引用可以独立与对象存在,不是必须要与对象关联。

2 必须由你创建所有对象

2.1 存储到什么地方

程序运行时,对象是怎么进行放置安排的呢?特别是内存是怎样分配的呢?

  1. 寄存器
  2. 堆栈
  3. 常量存储 字符串池(特殊的静态存储区)
  4. 非RAM存储 流对象 和 持久化对象
2.2 特例:基本类型

new一个特别小的、简单的变量,往往不是很有效。
对于基本类型的变量,不用new来创建对象,而是创建一个并非是引用的“自动”变量。这个变量直接存储“值”,并置于堆栈中,因此更加有效。

在Java中,所有的数值类型都有正负号,所以不要去寻找无符号的数值类型。
boolean类型所占存储空间的大小没有明确的规定,仅定义为能够取字面值truefalse
基本类型具有的包装类,使得可以在堆中创建一个非基本对象,用来表示对应的基本类型。

Java SE5的自动包装功能将自动地将基本类型转换为包装器类型

高精度数字
Java提供了两个用于高精度计算的类:BigIntegerBigDecimal。(速度换取精度)

2.3 Java中的数组

Java确保数组会被初始化,而且不能在它的范围之外被访问。这种范围检查,是以每个数组上少量的内存开销及运行时的下标检查为代价的。
当创建一个数组对象时,实际上就是创建了一个引用数组,并且每个引用都会自动被初始化为一个特定值,该值拥有自己的关键字null

3 永远不需要销毁对象

变量生命周期的概念。变量需要存活多久?如果想要销毁对象,那什么时刻进行呢?

3.1 作用域

在作用域里定义的变量只可用于作用域结束之前。

3.2 对象的作用域

Java对象不具备和基本类型一样的生命周期。当用new创建一个Java对象时,他可以存活于作用域之外。
在C++中,你不仅必须要确保对象的保留时间与你需要这些对象的时间一样长,而且还必须在你使用完它们之后,将其销毁。
Java有一个垃圾回收器。

4 创建新的数据类型:类

class这个关键字之后紧跟着的是新类型的名称。

4.1 字段和方法

在Java中你所做的全部工作就死定义类,产生那些类的对象,以及发送消息给这些对象。
一旦定义了一个类,就可以再类中设置两种类型的元素:字段(有时被称为数据成员)和方法(有时被称为成员函数)。字段可以是任何类型的对象,可以通过其引用与其进行通信;也可以是基本类型中的一种。如果字段是对某个对象的引用,那么必须初始化该引用,以便使其与一个实际的对象(如前所述,使用new来实现)相关联。

每个对象都有用来存储其字段的空间;普通字段不能在对象之间共享。

基本成员默认值
当变量作为类的成员使用时,Java才确保给定其默认值,以确保那些事基本类型的成员变量得到初始化(C++没有此功能),防止产生程序错误。

5 方法、参数和返回值

方法的基本组成部分包括:名称,参数,返回值和方法体。
方法名和参数列表(它们合起来被称为“方法签名”)唯一的标识出某个方法。
Java中的方法只能作为类的一部分来创建。方法只有通过对象才能被调用,且这个对象必须能执行这个方法调用。
面相对象的程序设计通常简单地归纳为“向对象发送信息”。

5.1 参数列表

程序似乎只是一系列带有方法的对象组合,这些方法以其他对象为参数,并发送消息给其他对象。

6 构建一个Java程序

6.1 名字可见性

为解决函数名冲突问题:

  1. C++类使用名字空间
  2. Java则将自己的域名倒过来

这种机制意味着所有的文件都能够自动存活于它们自己的名字空间内,而且同一个文件内的每个类都有唯一的标识符——Java语言本身已经解决了这个问题。

6.2 运用其他构件

Java消除了所谓的“向前引用”问题
import指示编译器导入一个包,也就是一个类库(在其他语言中,一个库不仅包含类,还可能包含方法和数据;但是Java中所有的代码必须写在类里)。

6.3 static 关键字
  • 只想为某特定域分配单一存储空间,而不去考虑究竟要创建对象,甚至根本就不创建任何对象。
  • 希望某个方法不与包含它的类的任何对象关联在一起。也就是说,即使没有创建对象,也能够调用这个方法。

通过static关键字可以满足这两方面的需要。当声明一个事物是static时,就意味着这个域或方法不会与包含它的那个类的任何对象实例关联在一起。
有些面向对象语言采用类数据类方法两个方法,代表那些数据和方法只是作为整个类,而不是类的某个特定对象而存在的。

尽管当static作用域某个字段时,肯定会改变数据创建的方式(因为一个static字段对每个类来说都只有一份存储空间,而非static字段则是对每个对象有一个存储空间),但是如果static字段作用与某个方法,差别去没有那么大。static方法的一个重要用法就是在不创建任何对象的前提下就可以调用它。正如我们将会看到的那样,这一点对定义main()方法很重要,这个方法是运行一个应用时的入口。

7 你的第一个Java程序

java.lang是默认导入到每个Java文件中的。
类的名字必须和文件名相同。如果你像现在这样创建一个独立运行的程序,那么文件中必须存在某个类与该文件同名(否则,编译器会报错,)且那个类必须包含一个名为main的方法。

7.1 编译和运行

javac java

8 注释和嵌入式文档

单行注释和多行注释

8.1 注释文档

javadoc便是用于提取注释的工具,它是JDK安装的一部分。它采用了Java编译器的某些技术,查看程序内的特殊注释标签。它不仅解析由这些标签标记的信息,也将毗邻注释的类名或方法名抽取出来。如此,我们就可以用最少的工作量,生成相当好的程序文档。

javadoc输出的是一个HTML文件,可以用Web浏览器查看。这样,该工具就使得我们只需创建和维护单一的数据源,并能自动生成有用的文档。有了javadoc,就有了创建文档的简明直观的标准;我们可以期望、甚至要求所有的java类库都提供相关的文档。

8.2 语法

共有三种类型的注释文档,分别对应于注释位置后面的三种元素:类、域和方法。
注意,javadoc只能为publicprotect成员进行文档注释。private和包内可访问成员的注释会被忽略掉,所以输出结果中看不到它们(不过可以用-private进行标记,以便把private成员的注释也包括在内)。独立文档标签是一些以“@”字符开头的命令,且要置于注释行的最前面(但是不算前导“*”之后的最前面)。而行内文档注释则可以出现在javadoc注释中的任何地方,它们也是以“@”字符开头,但是要在花括号内。

8.3 嵌入式HTML

所有类型的注释文档——类、域和方法——都支持嵌入式HTML。

8.4 一些标签示例

1.@see:引用其他类
2.{@link package.class#member lable}与@see极其相似,只是它作用于行内,并且是用“lable”作为超链接文本而不用“See Also”
3.{@docRoot}
4.{@inheritDoc}
5.@version
6.@author
7.@since
8.@param
9.@return
10.@throws
10.@deprecated

8.5 文档示例

9 编码风格

类名的首字母要大写;如果类名由几个单词构成,那么把它们并在一起(也就是说,不要用下划线来分隔名字),其中每个内部单词的首字母都采用大写形式。

这种风格有时被称作驼峰风格。几乎其他所有内容——方法、字段(成员变量)以及对象引用名称等,公认的风格与类的风格一样,只是标识符的第一个字母采用小写。

10 总结

写一个简单的Java程序锁需要的基础知识,要掌握javadoc工具,并要学会习惯写文档注释,使得自己写出的程序文档有更好的可读性。