3.1 类简介

类是 Java 程序最基本的元素结构。编写 Java 代码不可能不定义类。所有 Java 语句都在类中,而且所有方法都在类中实现。

3.1.1 面向对象的基本概念

下面是两个重要的概念。

类由一些保存值的数据字段和处理这些值的方法组成。类定义一种新的引用类型,例如第 2 章定义的 Point 类型。

Point 类定义的类型能表示所有二维点。

  • 对象

对象是类的实例。

Point 对象是这个类型的一个值,即表示一个二维点。

对象一般通过实例化类创建,方法是使用 new 关键字并调用构造方法,如下所示:

  1. Point p = new Point(1.0, 2.0);

构造方法将在 3.3 节介绍。

一个类的定义包含一个签名和一个主体。类的签名定义类的名称,可能还会指定其他重要信息。类的主体是一些放在花括号里的成员。类的成员一般包含字段和方法,也可以包含构造方法、初始化程序和嵌套类型。

成员可以是静态的,也可以是非静态的。静态成员属于类本身,而非静态成员关联在类的实例上(参见 3.2 节)。

3.1 类简介 - 图1 常见的成员有四种:类字段、类方法、实例字段和实例方法。Java 的主要工作就是与这些成员交互。

类的签名可能会声明它扩展自其他类。被扩展的类叫作超类,扩展其他类的类叫作子类。子类继承超类的成员,而且可以声明新成员,或者使用新的实现覆盖继承的方法。

类的成员可以使用访问修饰符 publicprotectedprivate。1 这些修饰符指定成员在使用方和子类中是否可见以及能否访问。类通过这种方式控制对非公开 API 成员的访问。隐藏成员是一种面向对象设计技术,叫作数据封装(data encapsulation),3.5 节会介绍。

1稍后会见到默认的可见性,即在包中可见。

3.1.2 其他引用类型

类的签名可能还会声明类实现了一个或多个接口。接口是一种类似于类的引用类型,其中定义了方法签名,但一般没有实现方法的方法主体。

不过,从 Java 8 开始,接口可以使用关键字 default 指明其中的方法是可选的。如果方法是可选的,接口文件必须包含默认的实现(因此才选用 default 这个关键词);所有实现这个接口的类,如果没有实现可选的方法,就使用接口中默认的实现。

实现接口的类必须为接口的非默认方法提供主体。实现某个接口的类的实例,也是这个接口类型的实例。

类和接口是 Java 定义的五种基本引用类型中最重要的两个。另外三个基本引用类型是数组、枚举类型和注解类型(通常直接叫“注解”)。第 2 章已经介绍过数组。枚举是特殊的类,注解是特殊的接口——第 4 章会介绍这两种类型,还会全面说明接口。

3.1.3 定义类的句法

最简单的类定义方式是在关键字 class 后面放上类的名称,然后在花括号中放一些类的成员。class 关键字前面可以放修饰符关键字或注解。如果类扩展其他类,类名后面要加上 extends 关键字和要扩展的类名。如果类实现一个或多个接口,类名或 extends 子句之后要加上 implements 关键字和用逗号分隔的接口名。例如:

  1. public class Integer extends Number implements Serializable, Comparable {
  2. // 这里是类的成员
  3. }

定义泛型类时还可以指定类型参数和通配符(参见第 4 章)。

类声明可以包含修饰符关键字。除访问控制修饰符(publicprotected 等)之外,还可以使用:

  • abstract

abstract 修饰的类未完全实现,不能实例化。只要类中有 abstract 修饰的方法,这个类就必须使用 abstract 声明。抽象类在 3.6 节介绍。

  • final

final 修饰符指明这个类无法被扩展。类不能同时声明为 abstractfinal

  • strictfp

如果类声明为 strictfp,那么其中所有的方法都声明为 strictfp。这个修饰符极少使用。