![On Java:中文版·基础卷](https://wfqqreader-1252317822.image.myqcloud.com/cover/337/53256337/b_53256337.jpg)
字段
当定义一个类时,你可以为其定义两种元素:字段(有时叫作“数据成员”)和方法(有时叫作“成员函数”)。我们通过对象的引用与字段进行交互。字段可以是任何类型的对象,也可以是基本类型。如果一个字段是某个对象的引用,你必须通过new关键字(请参考之前的相关介绍)初始化该引用并将其关联到具体的对象上。
每一个对象都会单独保存其字段。通常来说,不同对象的字段之间不会共享。下面的代码是一个定义了字段的类:
![](https://epubservercos.yuewen.com/F9F485/31727349203472506/epubprivate/OEBPS/Images/58501_66_03.jpg?sign=1739560482-d4voQaZHRbiUliAGzdsPk7SqMJzny9SA-0-e9f3c935977aa15fc4a6098893b01276)
这个类只是定义了几个数据字段而已。和之前一样,你可以这样创建一个该类的对象:
![](https://epubservercos.yuewen.com/F9F485/31727349203472506/epubprivate/OEBPS/Images/58501_66_04.jpg?sign=1739560482-ozHi9dG7OzX98LjbqvWGE8UcabEqcjNe-0-232e2a467bd9f8e548f9993108e80745)
你可以通过对象成员为字段赋值。具体做法是,先写出对象的引用名,跟着再写一个“.”,然后是对象的成员名:
![](https://epubservercos.yuewen.com/F9F485/31727349203472506/epubprivate/OEBPS/Images/58501_67_01.jpg?sign=1739560482-oV0ENrLjaPpRcBD5edVlxegXPGExzQlg-0-5113810dc77fb264bb6fd059e8dcd970)
例如,我们可以这样为字段赋值:
![](https://epubservercos.yuewen.com/F9F485/31727349203472506/epubprivate/OEBPS/Images/58501_67_02.jpg?sign=1739560482-HfM8SiMgX1FE6loMRBKgYA13cHu1WrI1-0-12b0bb090d42211246c8fec2884a570f)
如果一个对象包含了其他对象,而你想要修改其他对象的数据,该怎么办?同样可以使用“.”来实现,例如:
![](https://epubservercos.yuewen.com/F9F485/31727349203472506/epubprivate/OEBPS/Images/58501_67_03.jpg?sign=1739560482-GAa5nDDwSVyH4ftlSsNzJ17nx3i9w5YF-0-911f1d4c2c729d5c6f9e07eb9f596a49)
理论上你可以用这种方法嵌套无穷多的对象(但是需要提醒的是,这种设计方式并不优雅)。
基本类型的默认值
当一个类的字段是基本类型时,即便你没有初始化这些字段,它们也会拥有默认值,如表3-2所示。
当变量作为类成员存在时,Java才会将其初始化为以上的默认值。这一特点确保了基本类型的字段一定会被初始化(而C++就不会这么做),并且从源头减少了许多不应该出现的bug。只不过对于你编写的程序而言,这些默认值可能并不是正确或合理的值,所以最佳实践应该是你显式地初始化这些变量。
表3-2
![](https://epubservercos.yuewen.com/F9F485/31727349203472506/epubprivate/OEBPS/Images/58501_67_04.jpg?sign=1739560482-ILU2EpxOS2ijyggKJHsUDjke6MOiTXRy-0-17e08bb0d5da37a359466b2833528127)
此外,这种机制并不会应用于局部变量(local variable),因为局部变量并不是类的字段。因此,如果你在一个方法内部编写如下代码:
![](https://epubservercos.yuewen.com/F9F485/31727349203472506/epubprivate/OEBPS/Images/58501_67_05.jpg?sign=1739560482-T2hHOgr80oQYy7y2onaWS54LNF7bOGiG-0-f4521be5dbfa9c285c015b79d9bc61ff)
那么变量x可能是一个任意值(和C/C++一样),而不会自动被初始化为0。因此,在使用变量x之前,你必须为其赋值以确保正确性。如果你忘记了赋值,Java的处理方式明显要比C++更好一些—Java会抛出一个编译错误以告知你变量没有被初始化(相比之下,C++编译器通常只是警告你有些变量没有被初始化,而Java则是直接抛出错误)。