创建新的数据类型:类
如果一切都是对象,那么是什么决定了某一类对象的外观与行为呢?换句话说,是什么确定了对象的类型?你可能期望有一个名为“type”的关键字,当然它必须还有相应的含义,然而,从历史发展角度来看。大多数面向对象的程序设计语言习惯用关键字class来表示“我准备告诉你一种新类型的对象看起来像什么样子”。class这个关键字之后紧跟的是新类型的名称,例如:
class ATypeName {/*Class body goes here */}
这就引用了有一种新的类型,尽管类主体仅包含一条注释词语(星号和斜杠以及其中的内容就是注释)。因此,你还不能用它做太多的事情。然而,你已经用new来创建这种类型的对象:
ATypeName a = new ATypeName();
但是,在定义它的所有方法之前,还没有办法能让它去做更多的事情(也就是说,不能向他发送任何有意义的消息)。
字段和方法
一旦定义了一个类(在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;
想修改的数据也有可能位于对象所包含的其他对象中。在这种情况下,只需要再使用连接句点即可。例如:
myPlane.leftTank.capacity = 100;
DataOnly类除了保存数据外没别的用处,因为它没有任何成员方法。如果想了解成员方法的运行机制,就得先了解参数和返回值的概念。
基本成员默认值
若类的某个成员是基本数据类型,即使没有进行初始化,Java也会确保它获得一个默认值:
基本类型 | 默认值 |
---|---|
boolean | false |
char | ‘\uoooo’(null) |
byte | (byte)o |
short | (short)o |
int | o |
long | oL |
float | o.of |
double | o.od |
当变量作为类的成员使用时,Java才确保给定其默认值,以确保那些是基本类型的成员变量得到初始化(C++没有此功能),防止产生程序错误。但是,这些初始值对你的程序来说,可能是不正确的,甚至是不合法的。所以最好明确地对变量进行初始化。
然而上述确保初始化的方法并不适用于“局部”变量(即并非某个类的字段)。因此,如果在某个方法定义中有
int x;
那么变量x得到的可能是人任意值(与C和C++中一样),而不会被主动初始化为零。所以在使用x变量没有初始化,这正是Java由于C++的地方。(许多C++编译器会对未初始化变量给予警告,而Java则视为是错误)。