如果一切皆为对象,那么具体到某一类对象的外观和行为是如何确定的呢?换句话说,我们如何创建对象的类型?说到这里,你可能会想当然地认为会有一个名为 “type” 的关键字,然而由于历史原因,大多数面向对象编程语言会使用 “class” 关键字来描述新的对象种类。其用法是 class 关键字后面跟着新的类名:

  1. class ATypeName {
  2. // 类的具体实现放在这里
  3. }

这段代码创建了一个新的类,只不过其内容只包含了一行注释,因此目前也没有什么实际的作用。话虽如此,你还是可以通 过new 关键字创建一个该类的对象:

  1. ATypeName a = new ATypeName();

到目前为止,这个类能做的事情并不多。也就是说,除非你为这个类定义了一些方法,否则你无法对其发送所需的消息。

字段

当定义一个类时,你可以为其定义两种元素:字段(有时叫作 “数据成员”)和方法(有时叫作 “成员函数” )。我们通过对象的引用与字段进行交互。字段可以是任何类型的对象,也可以是基本类型。如果一个字段是某个对象的引用,你必须通过 new 关键字(请参考之前的相关介绍)初始化该引用并将其关联到具体的对象上。
每一个对象都会单独保存其字段。通常来说,不同对象的字段之间不会共享。下面的代码是一个定义了字段的类:

  1. class DataOnly {
  2. int i;
  3. double d;
  4. boolean b;
  5. }

这个类只是定义了几个数据字段而已。和之前一样,你可以这样创建一个该类的对象:

  1. DataOnly data = new DataOnly();

你可以通过对象成员为字段赋值。具体做法是,先写出对象的引用名,跟着再写一个 “.”,然后是对象的成员名:

  1. objectReference.member

例如,我们可以这样为字段赋值:

  1. data.i = 47;
  2. data.d = 1.1;
  3. data.b = false;

如果一个对象包含了其他对象,而你想要修改其他对象的数据,该怎么办?同样可以使用“.”来实现,例如:

  1. myPlane.leftTank.capacity = 100;

理论上你可以用这种方法嵌套无穷多的对象(但是需要提醒的是,这种设计方式并不优雅)。

基本类型的默认值

当一个类的字段是基本类型时,即便你没有初始化这些字段,它们也会拥有默认值,如表 3-2 所示。
表3-2

基本类型 默认值
boolean false
char \u0000(null)
byte (byte)0
short (short)0
int 0
long 0L
float 0.0f
double 0.0d

当变量作为类成员存在时,Java 才会将其初始化为以上的默认值。这一特点确保了基本类型的字段一定会被初始化(而 C++ 就不会这么做),并且从源头减少了许多不应该出现的 bug。只不过对于你编写的程序而言,这些默认值可能并不是正确或合理的值,所以最佳实践应该是你显式地初始化这些变量。
此外,这种机制并不会应用于局部变量(local variable),因为局部变量并不是类的字段。因此,如果你在一个方法内部编写如下代码: