二十一、类的声明与使用
类是 Java 中的一种重要的引用数据类型,也是组成 Java 程序的基本要素,因为所有的 Java 程序都是基于类的。我们以前写过程序时,虽然没有学习过“类”的概念,但当我们写下 public class XXX
时,我们实际上就使用到了“类”。
1 声明一个简单的类
我们以一个 Person 类为例,了解一下声明一个简单的类的语法:
class Person {
public String name; // 姓名
public int age; // 年龄
}
class
:表示我们正在声明一个类。Person
:类的名字,简称“类名”。类名属于标识符,要符合标识符命名规则,一般使用“大驼峰命名法”。public String name
:类的一个属性。类中的数据和方法统称为类成员。其中,类的属性就是类的数据成员,也可以称为类的成员变量或字段。用来描述一个类的特征。这里我们定义了一个String
类型的字段,命名为name
,用来描述人的名字。public
:用来修饰字段时,它表示这个字段可以在类的声明语句块外被访问。
2 创建对象
创建一个新的类,就是定义了一个对象模板,也可以说是创建一个新的数据类型。
对于一个数据类型来说,我们并不能直接操作它,我们能操作的,是此数据类型的变量。
对类来说,也是一样的。我们不能操作类,只能操作“类”这个数据类型对应的变量——对象。对象也被称为“类的一个实例”,因此,创建实例的过程,也被称为“类的实例化”,或“实例化一个类”。
new
操作符可以创建一个实例,然后,我们需要定义一个引用类型的变量来指向这个实例:
Person ming = new Person();
上述代码创建了一个 Person
类型的实例,并通过变量 ming
指向它。
注意区分 Person ming
是定义 Person
类型的变量 ming
,而 new Person()
是创建Person
实例。
3 使用实例变量
有了指向这个实例的变量 ming
,我们就可以通过这个变量来操作实例。访问实例变量可以用 变量.字段
,例如
ming.name = "Xiao Ming"; // 对字段name赋值
ming.age = 12; // 对字段age赋值
System.out.println(ming.name); // 访问字段name
Person hong = new Person();
hong.name = "Xiao Hong";
hong.age = 15;
上述两个变量分别指向两个不同的实例,它们在内存中的结构如下:
两个实例都拥有 Person
类中定义的 name
和 age
字段,且各自都有一份独立的数据,互不干扰。
4 完整代码
以下是本节的完整代码:
public class Main {
public static void main(String[] args) {
Person ming = new Person();
ming.name = "Xiao Ming"; // 对字段name赋值
ming.age = 12; // 对字段age赋值
System.out.println(ming.name); // 访问字段name
System.out.println(ming.age); // 访问字段age
Person hong = new Person();
hong.name = "Xiao Hong";
hong.age = 15;
System.out.println(hong.name); // 访问字段name
System.out.println(hong.age); // 访问字段age
}
}
class Person {
public String name; // 姓名
public int age; // 年龄
}
Main
与 Person
都是类,级别上是平级的,所以 Person
不能写在 Main
的类体中,不然 Person
就变成 Main
的下级了。
在这段代码中,我们看到 public
也可以修饰 class
,这表示这个 class
是一个“公共类”,它的含义不属于本节课的内容,但必须提醒大家:
一个Java源文件可以包含多个类的定义,但只能定义一个public类,且public类名必须与文件名一致。如果要定义多个public类,必须拆到多个Java源文件中。
5 小结
在OOP中,class
和instance
是“模版”和“实例”的关系;
定义class
就是定义了一种数据类型,对应的instance
是这种数据类型的实例;
class
定义的field
,在每个instance
都会拥有各自的field
,且互不干扰;
通过new
操作符创建新的instance
,然后用变量指向它,即可通过变量来引用这个instance
;
访问实例字段的方法是变量名.字段名
;
指向instance
的变量都是引用变量。