二十一、类的声明与使用

类是 Java 中的一种重要的引用数据类型,也是组成 Java 程序的基本要素,因为所有的 Java 程序都是基于类的。我们以前写过程序时,虽然没有学习过“类”的概念,但当我们写下 public class XXX 时,我们实际上就使用到了“类”。

1 声明一个简单的类

我们以一个 Person 类为例,了解一下声明一个简单的类的语法:

class Person {
    public String name;    // 姓名
    public int age;    // 年龄
}
  1. class :表示我们正在声明一个类。

  2. Person :类的名字,简称“类名”。类名属于标识符,要符合标识符命名规则,一般使用“大驼峰命名法”。

  3. public String name:类的一个属性。类中的数据和方法统称为类成员。其中,类的属性就是类的数据成员,也可以称为类的成员变量字段。用来描述一个类的特征。这里我们定义了一个 String 类型的字段,命名为 name ,用来描述人的名字。

  4. 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;

上述两个变量分别指向两个不同的实例,它们在内存中的结构如下:

Java类的声明与使用.png

两个实例都拥有 Person 类中定义的 nameage 字段,且各自都有一份独立的数据,互不干扰。

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;    // 年龄
}

MainPerson 都是类,级别上是平级的,所以 Person 不能写在 Main 的类体中,不然 Person 就变成 Main 的下级了。

在这段代码中,我们看到 public 也可以修饰 class ,这表示这个 class 是一个“公共类”,它的含义不属于本节课的内容,但必须提醒大家:

一个Java源文件可以包含多个类的定义,但只能定义一个public类,且public类名必须与文件名一致。如果要定义多个public类,必须拆到多个Java源文件中。

5 小结

在OOP中,classinstance是“模版”和“实例”的关系;

定义class就是定义了一种数据类型,对应的instance是这种数据类型的实例;

class定义的field,在每个instance都会拥有各自的field,且互不干扰;

通过new操作符创建新的instance,然后用变量指向它,即可通过变量来引用这个instance

访问实例字段的方法是变量名.字段名

指向instance的变量都是引用变量。