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

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

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

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

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

理论上你可以用这种方法嵌套无穷多的对象(但是需要提醒的是,这种设计方式并不优雅)。
基本类型的默认值
当一个类的字段是基本类型时,即便你没有初始化这些字段,它们也会拥有默认值,如表3-2所示。
当变量作为类成员存在时,Java才会将其初始化为以上的默认值。这一特点确保了基本类型的字段一定会被初始化(而C++就不会这么做),并且从源头减少了许多不应该出现的bug。只不过对于你编写的程序而言,这些默认值可能并不是正确或合理的值,所以最佳实践应该是你显式地初始化这些变量。
表3-2

此外,这种机制并不会应用于局部变量(local variable),因为局部变量并不是类的字段。因此,如果你在一个方法内部编写如下代码:

那么变量x可能是一个任意值(和C/C++一样),而不会自动被初始化为0。因此,在使用变量x之前,你必须为其赋值以确保正确性。如果你忘记了赋值,Java的处理方式明显要比C++更好一些—Java会抛出一个编译错误以告知你变量没有被初始化(相比之下,C++编译器通常只是警告你有些变量没有被初始化,而Java则是直接抛出错误)。