顶层类的 概述
顶层类可声明为 public,如前面示例中的 MyClass 类,也可声明为包私有的,如下:
/** * 定义一个包私有的顶层类。 */ class PackagePrivateClass { public static void main(String[] args) { System.out.println("PackagePrivateClass:这是一个包私有的顶层类。"); } } /* 输出结果: PackagePrivateClass:这是一个包私有的顶层类。 */ 提示:在定义一个类时,如果在 class 关键字前不加 public、private 或 protected 关键字,那么这个类就声明为包私有的(Package-Private),即它是类的默认声明。包私有的类可在其所在的包内共享,但不能跨包共享。不允许将顶层类声明为 private 或 protected,因为顶层类在本质上不属于私密类。如果将一个顶层类用 private 或 protected 关键字隐藏起来(即不对外共享),那就无法创建这个类的实例,等同于没有定义这个类。
此外,不允许将顶层类声明为 static,因为顶层类在本质上是非静态的,只有在创建其实例时,才会将其加载到内存中。否则,Java 编译器将会生成一条类似于“此处不允许使用修饰符 static”的错误消息。
并列多个顶层类
在 .java 文件中,允许多个顶层类并列存在,但只能有一个与其文件名同名的、声明为 public 的顶层类。这个与文件名同名的顶层类可声明为包私有的,但在这个文件中的其他顶层类只能声明为包私有的。
/** * 定义一个顶层类。 */ public class TopLevelClass { public static void main(String[] args) { System.out.println("TopLevelClass:这是与 TopLevelClass.java 文件同名的顶层类。"); System.out.println(new AnotherClass().toString()); } } /** * 定义另一个顶层类。 */ class AnotherClass { public AnotherClass() { } @Override public String toString() { return "AnotherClass:这是在 TopLevelClass.java 文件中的另一个顶层类。"; } } /* 输出结果: TopLevelClass:这是与 TopLevelClass.java 文件同名的顶层类。 AnotherClass:这是在 TopLevelClass.java 文件中的另一个顶层类。 */在上述示例中,若将 AnotherClass 类声明为 public,则 Java 编译器将会生成一条类似于“类 AnotherClass 是公共的,应在名为 AnotherClass.java 的文件中声明”的错误消息。
声明抽象类
可使用 abstract 关键字,将顶层类声明为抽象类,如下:
public class AbstractClassDemo { public static void main(String[] args) { new Subclass().printName(); } } /** * 定义一个抽象类。 */ abstract class AbstractClass { private final String name; // 定义抽象类的构造方法。 public AbstractClass() { name = "AbstractClass:这是一个抽象类。"; } // 定义一个非抽象方法。 public String getName() { return name; } // 定义一个抽象方法。 public abstract void printName(); } /** * 定义一个子类。 */ class Subclass extends AbstractClass { private final String name; // 定义子类的构造方法。 public Subclass() { super(); name = "Subclass:这是一个抽象类的子类。"; } // 实现父类的抽象方法。 @Override public void printName() { System.out.println(super.getName()); System.out.println(name); } } /* 输出结果: AbstractClass:这是一个抽象类。 Subclass:这是一个抽象类的子类。 */想要了解有关抽象类的更多信息,请参阅《抽象类》。