多应用+插件架构,代码干净,二开方便,首家独创一键云编译技术,文档视频完善,免费商用码云13.8K 广告
# 2.4 新建数据类型:类 (2)4 新建数据类型:类 如果说一切东西都是对象,那么用什么决定一个“类”(Class)的外观与行为呢?换句话说,是什么建立起了一个对象的“类型”(Type)呢?大家可能猜想有一个名为`type`的关键字。但从历史看来,大多数面向对象的语言都用关键字`class`表达这样一个意思:“我准备告诉你对象一种新类型的外观”。`class`关键字太常用了,以至于本书许多地方并没有用粗体字或双引号加以强调。在这个关键字的后面,应该跟随新数据类型的名称。例如: ``` class ATypeName {/*类主体置于这里} ``` 这样就引入了一种新类型,接下来便可用`new`创建这种类型的一个新对象: ``` ATypeName a = new ATypeName(); ``` 在`ATypeName`里,类主体只由一条注释构成(星号和斜杠以及其中的内容,本章后面还会详细讲述),所以并不能对它做太多的事情。事实上,除非为其定义了某些方法,否则根本不能指示它做任何事情。 ## 2.4.1 字段和方法 定义一个类时(我们在Java里的全部工作就是定义类、制作那些类的对象以及将消息发给那些对象),可在自己的类里设置两种类型的元素:数据成员(有时也叫“字段”)以及成员函数(通常叫“方法”)。其中,数据成员是一种对象(通过它的引用与其通信),可以为任何类型。它也可以是基本类型(并不是引用)之一。如果是指向对象的一个引用,则必须初始化那个引用,用一种名为“构造器”(第4章会对此详述)的特殊函数将其与一个实际对象连接起来(就象早先看到的那样,使用`new`关键字)。但若是一种基本类型,则可在类定义位置直接初始化(正如后面会看到的那样,引用亦可在定义位置初始化)。 每个对象都为自己的数据成员保有存储空间;数据成员不会在对象之间共享。下面是定义了一些数据成员的类示例: ``` class DataOnly { int i; float f; boolean b; } ``` 这个类并没有做任何实质性的事情,但我们可创建一个对象: ``` DataOnly d = new DataOnly(); ``` 可将值赋给数据成员,但首先必须知道如何引用一个对象的成员。为达到引用对象成员的目的,首先要写上对象引用的名字,再跟随一个点号(句点),再跟随对象内部成员的名字。即“对象引用.成员”。例如: ``` d.i = 47; d.f = 1.1f; d.b = false; ``` 一个对象也可能包含了另一个对象,而另一个对象里则包含了我们想修改的数据。对于这个问题,只需保持“连接句点”即可。例如: ``` myPlane.leftTank.capacity = 100; ``` 除容纳数据之外,`DataOnly`类再也不能做更多的事情,因为它没有成员函数(方法)。为正确理解工作原理,首先必须知道“参数”和“返回值”的概念。我们马上就会详加解释。 **1. 基本类型的成员的默认值** 若某个类成员属于基本类型,那么即使不明确(显式)进行初始化,也可以保证它们获得一个默认值。 基本类型 默认值 ``` Boolean false Char '\u0000'(null) byte (byte)0 short (short)0 int 0 long 0L float 0.0f double 0.0d ``` 一旦将变量作为类成员使用,就要特别注意由Java分配的默认值。这样做可保证基本类型的成员变量肯定得到了初始化(C++不具备这一功能),可有效遏止多种相关的编程错误。 然而,这种保证却并不适用于“局部”变量——那些变量并非一个类的字段。所以,假若在一个函数定义中写入下述代码: ``` int x; ``` 那么`x`会得到一些随机值(这与C和C++是一样的),不会自动初始化成零。我们责任是在正式使用x前分配一个适当的值。如果忘记,就会得到一条编译期错误,告诉我们变量可能尚未初始化。这种处理正是Java优于C++的表现之一。许多C++编译器会对变量未初始化发出警告,但在Java里却是错误。