2.1 用引用操纵对象
2.2 必须由你来创建所有对象
用关键字new创建一个对象。
2.2.1 存储到什么地方
有五个不同的地方可以存储数据:
1)寄存器。最快的存储区,处理器内部。
2)堆栈。位于通用RAM(速记访问存储器)中,但通过堆栈指针可以从处理器哪里获得支持。
3)堆。一种通用的内存池(也位于RAM区),用于存放所有的Java对象。
4)常量存储。常量值通常直接存放在程序代码内部,这样做是安全的,因为它们永远不会被改变。
5)非RAM存储。如果数据完全存活于程序之外,那么它可以不受程序的任何控制,在程序没有运行时也可以存在。其中两个基本的例子是流对象和持久化对象。
2.2.2 特例:基本类型
创建后,位于堆栈中。
Java中基本类型所占存储空间的大小并不像其他大多数语言那样随机器硬件架构的变化而变化。这种所占存储空间大小的不变性是Java程序比用其他大多数语言编写的程序更具可移植性的原因之一。
基本类型 | 大小 | 最小值 | 最大值 | 包装器类型 |
---|---|---|---|---|
boolean | - | - | - | Boolean |
char | 16-bits | Unicode 0 | unicode 2^16 -1 | Character |
byte | 8-bits | -128 | +127 | Byte |
short | 16 bits | -2^15 | +2^15-1 | Short |
int | 32 bits | -2^31 | +2^31+1 | Integer |
long | 64 bits | -2^63 | +2^63-1 | Long |
float | 32 bits | IEEE754 | IEEE754 | Float |
double | 64 bits | IEEE754 | IEEE754 | Double |
void | - | - | - | Void |
所有数值类型都有正负号。
boolean类型所占存储空间的大小并有明确指定,近定义为能够取字面值true或false。
基本类型具有的包装器,使得可以在堆中创建一个非基本对象,用来表示对应的基本类型。例如:
char c = 'x'; Character ch = new Character(c);
也可以这样用:
Charcter ch = new Character('x');
Java SE5的自动包装功能将自动地将基本类型转换为包装器类型:
Character ch = 'x'
并可以反向转换:
char c = ch;
高精度数字
Java提供了两个用于高精度计算的类:BigInteger和BigDecimal。虽然它们大体上属于“包装器类”的范畴,但二者都没有对应的基本类型。能作用于int或float的操作,也同样能作用于BigInteger和BigDecimal。只不过必须以方法调用方式取代运算符方式来实现。由于这么做复杂了许多,所以运算速度会比较慢。这里,以速度换取了精度。
BigInteger支持任意精度的整数。也就是说,在运算中,可以准确地表示任何大小的整数值而不会丢失任何信息。
BigDecimal支持任何精度的定点数。例如,可以用它进行精确的货币计算。
2.2.3 Java中的数组
Java确保数组会被初始化,而且不能在它的范围之外被访问。
2.3 永远不需要销毁对象
2.3.1 作用域
在作用域里定义的变量只可用于作用域结束之前。
2.3.2 对象的作用域
Java对象不具备和基本类型一样的声明周期。当用new创建一个Java对象时,它可以存活于作用域之外。
事实证明,由new创建的对象,只要你需要,就会一直保留下去。
Java有一个垃圾回收器,用来监视由new创建的所有对象,并辨别那些不会再被引用的对象。随后,释放这些对象的内存空间,以便供其他新的对象使用。
2.4 创建新的数据类型:类
class ATypeName{/*Class body goes here*/}
这就引入了一种新的类型。可以用new来创建这种类型的对象:
ATyepName a = new ATypeName();
2.4.1 字段和方法
一旦定义了一个类(在Java中你所做的全部工作就是定义类,产生那些类的对象,以及发送消息给这些对象),就可以在类中设置两种类型的元素:字段(有时被称作数据成员)和方法(有时被称作成员函数)。
每个对象都有一个用来存储其字段的空间,普通字段不能在对象间共享。下面是具有某些字段的类:
class DataOnly{ int i; double d; boolean b; }
创建它的一个对象:
DataOnly data = new DataOnly();
可以给字段赋值,但首先必须知道如何引用一个对象的成员。具体的实现为:在对象引用的名称之后紧接着一个句点,然后再接着是对象内部成员的名称:
objectReference.member
例如:
data.i = 47; data.d = 1.1; data.b = false;
基本成员默认值
若类的某个成员是基本数据类型,即使没有进行初始化,Java也会确保它获取一个默认值,如表:
基本类型 | 默认值 |
---|---|
boolean | false |
char | ‘\u0000’(null) |
byte | (byte)0 |
short | (short)0 |
int | 0 |
long | 0L |
float | 0.0f |
double | 0.0d |
但是,这些初始值对你的程序来说,可能是不正确的,甚至是不合法的。所以最好明确得对变量进行初始化。
然而上述确保初始化的方法并不适用于“局部”变量(即并非某个类的字段)。因此,如果在某个方法定义中有
int x;
那么变量x得到的可能是任意值,而不会被自动初始化为零。所以在使用x前,应先对其赋一个适当的值。如果忘记了这么做,Java会在编译时返回一个错误,告诉你此变量没有初始化。
2.5 方法、参数和返回值
Java的方法决定了一个对象能够接收什么样的消息。方法的基本组成部分包括:名称、参数、返回值和方法体。下面是它最基本的形式:
ReturnType methodName(/* Argument list */){ /*Method body */ }
方法名和参数列表(它们合起来被称为“方法签名”)唯一地标识出某个方法。
Java中的方法只能作为类的一部分来创建。方法只有通过对象才能被调用。通过对象调用方法时,需要先列出对象名,紧接着是句点,然后是方法名和参数列表。如:
objectName.methodName(arg1, arg2, arg3)
例如:
int x = a.f()
返回值的类型必须要与x的类型兼容。
这种调用方法的行为通常被称为发送消息给对象。在上面的例子中,消息是f(),对象是a。面向对象的程序设计通常简单地归纳为“向对象发送消息”。
2.5.1 参数列表
return 关键字的用法,它包括两方面:首先,它代表“已经做完,离开此方法”。其次,如果此方法产生了一个值,这个值要放在return语句后面。
2.6 构建一个Java程序
2.6.1 名字可见性
import 用来准确地告诉编译器你想要的类是什么。
例如:
import java.util.*
2.6.3 static 关键字
通常来说,当创建类时,就是在描述那个类的对象的外观与行为。除非用new创建那个类的对象,否则,实际上并未获得任何对象。执行new来创建对象时,数据存储空间才被分配,其方法才供外界调用。
当声明一个事物是static时,就意味着这个域或方法不会与包含它的那个类的任何对象实例关联在一起。所以,即使从未创建某个类的任何对象,也可以调用其static方法或者访问其static域。
只须将static关键字放在定义之前,就可以将字段或方法设定为static。例如,下面代码就生成了一个static字段,并对其进行了初始化:
class StaticTest { static int i = 47; }
现在,即使你创建了两个StaticTest对象,StaticTest也只有一份存储空间,这两个对象共享一个i。再看看下面代码:
StaticTest st1 = new StaticTest(); StaticTest st2 = new StaticTest();
在这里,st1.i和st2.i指向同一存储空间,因此它们具有相同的值47。
引用static变量有两种方法。如前所示,可以通过一个对象去定位它,如st2.i;也可以通过其类名直接引用,而这对于非静态成员则不行。
StaticTest.i ++;
此时,st1.i和st2.i仍具有相同的值48。
类似逻辑也应用于静态方法。static方法的一个重要用法就是在不创建任何对象的前提下就可以调用它。
2.7 你的第一个Java程序
2.8 注释和嵌入式文档
/* */
//
2.8.1 注释文档
javadoc输出是一个HTML文件。
2.8.2 语法
所有javadoc命令只能在“/**”注释中出现,和通常一样,注释结束于“*/”。使用javadoc的方式主要有两种:嵌入HTML,或使用“文档标签”。独立文档标签是一些以“@”字符开头的命令,且要置于注释行的最前面。而“行内文档标签”则可以出现在javadoc注释中的任何地方,它们也是以“@”字符开头,但要在花括号内。
共有三种类型的注释文档,分别对应于注释位置后面的三种元素:类、域和方法。也就是说,类注释正好位于类定义之前;域注释正好位于域定义之前;而方法注释也正好位于方法定义的前面。
2.8.3 嵌入式HTML
2.8.4 一些标签示例
2.8.5 文档示例
2.9 编码风格
类名的首字母要大写,如果类名由几个单词构成,那么把它们并在一起(也就是说,不要用下划线来分隔名字),其中每个内部单词的首字母都采用大写形式。例如:
class AllTheColorOfTheRainbow(){//..
这种风格称作“驼峰风格”。几乎其他所有内容——方法、字段(成员变量)以及对象引用名称等,公认的风格与类风格一样,只是标识符的第一个字母采用小写。例如:
class AllTheColorOfTheRainbow(){ int anIntegerRepresentingColors; void changeTheHueOfTheColor(int newHue){ //... } }
2.10 总结
一个总体认识。