现在您已经理解了类和对象在面向对象编程框架中的基本角色,也已经准备好专心深入了解 Java 平台上类的结构和实现的一些特性了:
类成员:类成员通常或者是一个 域,或者是一个 方法。域代表数据,方法代表操作。类可以定义任意多个成员。
访问修饰符:您可以使用 访问修饰符来声明类成员,这样可以指定类之外的元素对这些成员是否可访问。例如,被声明为私有的成员在类之外根本不能访问,但是公开成员可以自由访问。
对象:类实际上只是定义而已。您在代码中真正使用的是类的实例,称为 对象。后面您将了解到如何从类创建对象。
构造函数: 构造函数是一个用来创建对象的特殊操作。通常来讲,如果您不能对一个类创建对象,那么这个类也就没多少用处了。构造函数非常重要,因为它们提供了创建新类的实例的能力。
this 关键字: 隐式引用 Java 对象本身。您必须理解如何为这种目的而使用 this 关键字,这非常重要。
类成员
Java 类是一个独立的代码模块,其中以 成员的形式定义了很多属性和操作。域和方法就是成员的例子。
域是在类中声明的变量。Java 域有两种变种: 实例变量和 类变量。实例变量与类的每个实例有关,每个实例都有自己的一份实例变量的副本。类变量使用 static 关键字进行声明,与类整体有关,该类会与所有的类实例共享一个类变量。例如, BankAccount 中的 balance 域就是一个实例域,因为每个 BankAccount 实例都有自己的 balance 域,这与其他所有的 Account 对象的 balance 无关。另外一方面,您可以将一个 interest 域声明为一个类域,因为每个 BankAccount 对象都使用相同的利率。
方法是在类中声明的函数。Java 方法有两种变体: 实例方法和 类方法。对于实例方法来说,每个类实例都有自己的实例方法的副本;但是类方法则只有一份副本,所有的类实例都要共享这个副本。您可以使用 static 关键字来声明类方法。您应该对实例变量使用实例方法,对类变量使用类方法。例如, BankAccount 类中的 deposit() 方法是一个实例方法,因为每个 BankAccount 都有自己的 balance 域, deposit() 方法就会修改该域的值。您可以将 setInterest() 方法声明为一个类方法,因为所有的 BankAccount 都共享这个唯一的 interest 域,而 setInterest() 方法会修改该域的值。
清单 12 中给出的 BankAccount 类有 5 个成员。其中两个成员是域: balance 和 interest ,前者是一个实例域,后者是一个类域;三个成员是方法: deposit() 和 withdraw() 是实例方法,而 setInterest() 是类方法。注意您要使用对象名来访问实例成员,使用类名来访问类成员。
清单 12. BankAccount 类
2
3 public class BankAccount {
4
5 private float balance; // an instance field
6
7 private static float interest; // a class, or static, field
8
9 // an instance method
10
11 public void deposit(float amount) {
12
13 balance += amount;
14
15 }
16
17 // an instance method
18
19 public void withdraw(float amount) {
20
21 balance -= amount;
22
23 }
24
25 // a class, or static, method
26
27 public static void setInterest(float interestRate) {
28
29 interest = interestRate;
30
31 }
32
33 public static void main(String[] args) {
34
35 // create a new account object
36
37 BankAccount account = new BankAccount();
38
39 // deposit $250.00 into the account
40
41 account.deposit(250.00F);
42
43 // set interest rate for all BankAccount objects
44
45 BankAccount.setInterest(5.0F);
46
47 }
48
49 }
50
51
访问修饰符
与 Visual Basic 类似,Java 语言允许您对类成员的可见性进行设置。Java 成员使用 public 修饰符来说明一个成员在类内和类外都可以自由访问,使用 private 修饰符来说明一个成员只能在类内使用。私有成员在类外是不能访问的。
现在让我们再次考虑一下 BankAccount 类。假设您希望使用 BankAccount 对象的其他程序员也可以使用 deposit() 和 withdraw() 方法来修改 balance。那么您就需要将这两个方法声明为 public 类型的,这样就可以在 BankAccount 类之外的代码中调用这个类了。然而,您并不希望其他程序员直接修改 balance 域,因此就要将 balance 域声明为 private 类型的。
您可能会正在考虑默认的访问权限到底是哪个级别——也就是说,那些您既没有声明为 public 也没有声明为 private 的类成员的访问级别是什么呢?您可能会猜想默认的访问级别应该是 public ,在 Visual Baisc 中默认的访问级别就是 public 。实际上,在 Java 语言中默认的访问级别称为 包访问,因为只有同一个包中的类才有权访问这些类成员。如果您希望将一个成员声明为包访问的,就不要使用任何访问修饰符关键字。
Java 语言另外定义了一个访问级别,称为 受保护级别。当您希望在子类中可以访问一个超类的成员时,就可以使用 protected 修饰符。
创建对象
如果您浏览一下清单 12 中 BankAccount 类的 main() 方法就会看到创建一个新 BankAccount 对象的代码,如下所示:
2
首先,您声明了一个 BankAccount 类型的对象(也就是一个变量)。正如您可能猜到的一样, new 关键字会申请足够的内存来创建一个新对象。新创建的对象实际上是使用这个语句创建的: BankAccount() 。这条语句很像是一个方法调用。然而,清单 12 并没有声明一个这样的方法,因此您可能会纳闷这条语句到底执行什么操作。
实际上,这条语句是一个构造函数调用。如果没有构造函数,您就不能创建 Java 对象,因此如果您编写了一个没有构造函数的类,那么编译器就会为您创建一个默认的构造函数。这就是为什么即使我们没有在 BankAccount 类中显式地编写一个构造函数,仍然可以可以调用 BankAccount() 。
显式引用
Java 语言使用 this 关键字来引用当前对象。您可以使用 this 关键字显式地引用当前类中的域、方法和构造函数。
this 关键字最常见的用法是用来解决变量作用范围的问题。例如, BankAccount 类有一个 balance 域。让我们假设您希望编写一个名为 setBalance(float balance) 的方法,这个方法可以设置该对象的 balance 域。问题是在 setBalance(float balance) 方法中,当您引用 balance 时,您实际上是在引用 balance 参数,而不是 balance 域。您可以使用 this 关键字显式地引用这个域,方法如清单 13 所示。
清单 13. this 关键字
2
3 public void setBalance(float balance) {
4
5 this.balance = balance;
6
7 }
8