Java 一种面向对象的编程语言。Visual Basic 有很多对象特性,但是它却不是一种严格的面向对象的语言。在本节,我们将向您介绍如何在 Visual Basic 中构建一个类,然后再介绍如何在 Java 语言中构建一个等价的类。
类的使用
您可以认为 类就是您要定义的一种数据类型。一个类的变量实例称为 对象。与其他变量不同,对象具有类型、一组属性以及一组操作。对象的类型可以使用该对象实例化时所使用的类表示。对象的属性表示该对象的值或状态。对象的操作是您为了改变对象状态而调用的所有函数集。
考虑一下 Visual Basic 的基本数据类型 Integer ,它表示一个整数。您可以使用这种类型来创建一些变量,这些变量是一个整数的实例。每个 Integer 变量都有一个属性,这个属性表示该变量所持有的是整数数值。每个 Integer 变量都有相同的操作集,这些操作可以修改变量的状态(或值)。您可以对 Integer 变量执行的操作包括:加(+)、减(-)、乘(*)、除(\)以及取模(Mod)。
定义 Visual Basic 类
现在,让我们假设这样一种情况:您希望开发一个自己的类型——它可以表示一个复杂的对象,而在 Visual Basic 语言的基本类型并不支持这种类型。假设您是一名金融系统软件开发小组的成员,而您的任务是开发一些代码来表示一个典型的银行帐号。虽然一个银行有很多种帐号,但是每个帐号都有一些相同的基本属性和操作。具体来说,每个帐号都有一个余额和一个 ID 号。清单 10 中给出的 Visual Basic 代码就定义了一个 account 类。该类中定义三个操作: Deposit , Withdrawal 和 InitAccount (用来对帐户余额和帐户号码进行初始化)。注意您是如何使用一个私有变量来记录实际的帐号余额的,并且定义了一个名为 Balance 的属性以便让使用该类的用户可以获得帐户余额。
清单 10. 定义 Visual Basic 类
2
3 Private theAccountNumber As Integer
4
5 Public Sub InitAccount (number As Integer, initBal As Currency)
6
7 theAccountNumber = number
8
9 theBalance = initBal
10
11 End Sub
12
13 Public Sub Deposit (amount As Currency)
14
15 theBalance = theBalance + amount
16
17 End Sub
18
19 Public Sub Withdrawal (amount As Currency)
20
21 theBalance = theBalance - amount
22
23 End Sub
24
25 Public Property Get Balance() As Currency
26
27 Balance = theBalance
28
29 End Property
30
31 Public Property Get AccountNumber() As Integer
32
33 AccountNumber = theAccountNumber
34
35 End Property
36
37
定义 Java 类
清单 11 使用 Java 语言实现的了 Account 类。
清单 11. Java 语言 Account 类
2
3 private double balance;
4
5 private int number;
6
7 public Account(int number, double balance) {
8
9 number = argNumber;
10
11 balance = argBalance;
12
13 }
14
15 public void deposit(double amnt) {
16
17 balance += amnt;
18
19 }
20
21 public void withdrawal (double amnt) {
22
23 balance -= amnt;
24
25 }
26
27 public double getBalance() {
28
29 return balance;
30
31 }
32
33 public int getNumber() {
34
35 return number;
36
37 }
38
39 }
40
41
正如您可以看到的一样,定义一个 Java 类与定义一个 Visual Basic 类并不相同。这两种语言各自的 account 类间的主要区别如下:
在 Java 代码中,您并不需要使用一个单独的方法初始化一个 Account 类的实例。您使用的是 构造函数(constructor)。顾名思义,您可以使用构造函数来构造一个类的实例。构造函数名必须与定义它的类名相同,而且构造函数可以接收参数。您可以对一个类创建多个构造函数。如果您没有提供构造函数,那么程序可以自动使用一个没有参数的默认构造函数。您可以使用下面的方法来使用清单 11 中构造函数:
2
与 Visual Basic 不同,Java 语言对属性没有特殊的规定。按照约定,Java 属性都是私有的域,您通常会提供一组称为访问方法(accessor)的方法对包含这些属性的域进行访问。用来返回属性值方法称为 取值方法(getter),用来设置属性值的方法称为 赋值方法(setter)。下面是一个赋值方法的例子:
2
对一个类成员的默认访问修饰符不是 public ,这与 Visual Basic 不同(后文会进一步介绍访问修饰符)。
对象的优点
在诸如 Java 之类的面向对象语言中使用类和对象有三个主要的优点: 封装(encapsulation)、 继承(inheritance)和 多态(polymorphism)。
封装(或信息隐藏)是指将一个对象看作一个“黑盒”;也就是说,您可以不用知道(或关心)一个对象是如何实现的就可以使用这个对象。通过类中定义的方法(操作)所定义的接口来访问对象可以修改类的实现,而不会破会使用该类对象的任何代码。
多态是对相同的名字关联不同特性、而且可以根据上下文选择正确特性的能力。多态最常见的例子是方法的重载,此时您可以定义名字相同的多个方法,前提是这些方法使用不同的参数。
继承 是指通过编写对现有的类进行扩展的新类而对代码进行重用。例如,让我们假设您希望编写一个新类来代表一个支票帐号。由于支票帐号是一种特殊的银行帐号,因此您可以编写一个 CheckingAccount 类(称为子类)对 Account 类进行扩展。这样 CheckingAccount 类就可以自动获得 Account 类中的所有状态和所有操作(函数)。您只需要向 CheckingAccount 类中添加一些特殊的新状态和操作即可。例如,您可以添加一个 cashCheck() 函数来执行为支票帐号存入现金的操作。如果需要,您还可以修改子类继承的状态或行为。例如,一个用户可能会被允许从她的支票帐号中提款,因此您就可能需要重载原来的 withdrawal 函数。