Java 中的未命名类和实例主方法
上次更新:2024 年 1 月 8 日
1. 简介
Java 21 已经发布,在新的特性中,我们可以看到 Java 正在变得越来越容易上手,特别是有了 未命名类和实例主方法。这些特性的引入是使 Java 成为更易于学习的编程语言的关键一步。
在本教程中,我们将探索这些新特性,并了解它们如何使学生的学习曲线更加平滑。
2. 编写一个基本的 Java 程序
传统上,对于初学者来说,编写第一个 Java 程序比在其他编程语言中稍微复杂一些。一个基本的 Java 程序需要声明一个public 类。该类包含一个public static void main(String[] args) 方法,作为程序的入口点。
所有这些只是为了在控制台中输出一个 “Hello world”
public class HelloWorld {
public static void main(String[] args) {
System.out.println("Hello, World!");
}
}
Java 21 极大地简化了我们编写简单程序的方式
void main() {
System.out.println("Hello, World!");
}
我们将更详细地介绍如何使用新特性实现这种语法简化。
3. 实例主方法
实例 main() 方法的引入允许开发人员利用更动态的方法来初始化他们的应用程序。
3.1. 了解实例主方法
这改变了 Java 程序声明其入口点的方式。事实上,早期的 Java 要求在public 类中存在一个 static main() 方法,该方法具有 String[] 参数,如前一节中所见。
这个新协议更加宽松。它允许使用具有不同 访问级别的 main() 方法:public、protected 或默认(包)。
此外,它不需要方法是 static 的,也不需要具有 String[] 参数
class HelloWorld {
void main() {
System.out.println("Hello, World!");
}
}
3.2. 选择启动协议
改进的启动协议会自动选择程序的起点,同时考虑可用性和访问级别。
实例 main() 方法应始终具有非private 访问级别。 此外,启动协议遵循特定顺序来决定使用哪个方法
- 在启动类中声明的 static void main(String[] args) 方法
- 在启动类中声明的 static void main() 方法
- 在启动类或超类中声明或继承的 void main(String[] args) 实例方法
- void main() 实例方法
当一个类声明一个实例 main() 方法并继承一个 标准的 static main() 方法 时,系统会调用实例 main() 方法。在这种情况下,JVM 会在运行时发出警告。
例如,假设我们有一个超类 HelloWorldSuper,它实现了一个 久经考验main() 方法
public class HelloWorldSuper {
public static void main(String[] args) {
System.out.println("Hello from the superclass");
}
}
这个超类被 HelloWorldChild 类扩展
public class HelloWorldChild extends HelloWorldSuper {
void main() {
System.out.println("Hello, World!");
}
}
让我们使用 — source 21 和 –enable-preview 标志编译超类并运行子类
javac --source 21 --enable-preview HelloWorldSuper.java
java --source 21 --enable-preview HelloWorldChild
我们将在控制台中得到以下输出
WARNING: "void HelloWorldChild.main()" chosen over "public static void HelloWorldSuper.main(java.lang.String[])"
Hello, World!
我们可以看到 JVM 警告我们程序中有两个可能的入口点。
4. 未命名类
未命名类是一个重要的特性,旨在简化初学者的学习曲线。 它允许方法、字段和类在没有显式类声明的情况下存在。
通常,在 Java 中,每个类都存在于一个包中,每个包都存在于一个模块中。然而,未命名类存在于未命名的包和未命名的模块中。它们是final 的,并且只能扩展 Object 类而不实现任何接口。
鉴于所有这些,我们可以在代码中不显式声明类的情况下声明 main() 方法
void main() {
System.out.println("Hello, World!");
}
利用这两个新特性,我们成功地将程序简化为一个非常简单的程序,任何刚开始学习 Java 编程的人都可以更容易地理解。
无名类几乎与显式声明的类完全相同。其他方法或变量被解释为无名类的成员,因此我们可以将其添加到我们的类中。
private String getMessage() {
return "Hello, World!";
}
void main() {
System.out.println(getMessage());
}
尽管无名类简单且灵活,但它们本身存在固有的局限性。
直接构造或通过名称引用是不可能的,并且它们不定义任何可从其他类访问的 API。这种不可访问性还会导致 Javadoc 工具在生成此类类的 API 文档时出现故障。 然而,未来的 Java 版本可能会调整和增强这些行为。
5. 结论
在本文中,我们了解到 Java 21 引入了无名类和实例 main() 方法,在增强用户体验方面取得了显著进展,尤其是对于编程入门者而言。
通过简化编程的结构方面,这些特性使初学者能够更快地专注于逻辑思维和问题解决。
支持本文的代码可在 GitHub 上获取。 一旦你以 Baeldung Pro 会员 身份登录,就开始学习并在项目上进行编码。















