Java 21 的“无类主”特性:简化编程的第一步

news2025/4/25 7:55:10

在Java编程中,编写一个简单的“Hello, World!”程序通常需要以下代码:

public class HelloWorld {
    public static void main(String[] args) {
        System.out.println("Hello, World!");
    }
}

这种结构包含了许多对初学者来说难以理解的概念,如public classstaticString[] args。这些样板代码让初学者在学习编程基础之前就面临不必要的复杂性。Java 21通过引入“无类主”特性(Classless Main),即未命名类(Unnamed Classes)和实例主方法(Instance Main Methods),显著简化了这一过程。这是一个预览功能,旨在为初学者提供更平滑的入门体验,同时保持Java语言的完整性。

本文将详细探讨“无类主”特性的工作原理、实际应用、限制以及对教育和开发的影响,基于OpenJDK JEP 445和Oracle Java 21文档。

“无类主”特性概述

“无类主”特性由两个部分组成,均在Java 21中作为预览功能引入,定义于JEP 445:

  • 未命名类:当代码未显式定义类时,编译器会隐式创建一个类,称为未命名类。这种类无需显式声明,简化了程序结构。
  • 实例主方法:传统的主方法是静态的(public static void main(String[] args)),而实例主方法是非静态的,可以有更灵活的访问级别(如publicprotected或默认)。

这些特性旨在:

  • 为初学者提供平滑的Java学习路径,逐步引入编程概念。
  • 减少简单程序(如脚本或命令行工具)的样板代码。
  • 确保学生使用与专业开发者相同的工具(如javacjava),避免引入独立的初学者方言。

工作原理

未命名类

未命名类允许开发者直接编写方法和字段,而无需将其封装在类声明中。例如:

void main() {
    System.out.println("Hello, World!");
}

保存为hello.java,编译器会生成一个未命名类,文件名即为类名(hello)。未命名类的特性包括:

  • 始终为final,不可扩展或实现接口(仅继承Object)。
  • 不可命名引用,仅用于独立程序。
  • 支持导入语句,但不能有包声明。
  • 默认构造函数,仅提供零参数构造函数。
  • 修饰符,支持privatestatic,包括静态/实例初始化器。

实例主方法

实例主方法是非静态的,允许更灵活的定义。例如:

void main(String[] args) {
    System.out.println("Hello, World!");
}

JVM通过以下优先级选择主方法:

  1. static void main(String[] args)(非私有)
  2. static void main()(非私有)
  3. void main(String[] args)实例(非私有,声明或继承)
  4. void main()实例(非私有,声明或继承)

如果实例主方法覆盖了继承的静态主方法,JVM会发出警告。

运行程序

由于是预览功能,需启用特定选项。例如:

java --enable-preview --source 21 hello.java

在IDE中(如IntelliJ IDEA),需在项目设置中启用预览功能。编译后,可使用javap检查生成的类文件:

javac --enable-preview --source 21 hello.java
javap hello

输出显示生成的类结构,例如:

final class hello {
  hello();
  void main();
}

实际示例

以下是一个更复杂的示例,展示未命名类和实例主方法的结合:

import java.lang.reflect.*; // 支持导入

int x; // 实例字段

void main(String[] args) {
    System.out.println("Hello, world");
    process(1);
}

void process(int n) {
    System.out.println("Hello " + n);
}

保存为HelloClasslessWithMembers.java,运行:

java --enable-preview --source 21 HelloClasslessWithMembers.java

输出:

Hello, world
Hello 1

另一个示例展示主方法优先级:

public class HelloWorldSuper {
    public static void main(String[] args) {
        System.out.println("Hello from the superclass");
    }
}

public class HelloWorldChild extends HelloWorldSuper {
    void main() {
        System.out.println("Hello, World!");
    }
}

运行:

javac --source 21 --enable-preview HelloWorldSuper.java
java --source 21 --enable-preview HelloWorldChild

输出:

Hello, World!

这表明实例主方法优先于超类的静态主方法。

特性和限制

特性详情
未命名类隐式创建,属于未命名包/模块,始终final,仅继承Object,不可引用。支持privatestatic修饰符,默认零参数构造函数。Javadoc暂不支持。
实例主方法非静态,可为publicprotected或默认访问。优先级低于静态主方法。不可位于内联类。
启动命令使用java filename.java直接运行,需--enable-preview --source 21

限制

  • 未命名类不能包含包声明。
  • 文件名无需首字母大写,类名由文件名生成。
  • 实例主方法可选是否声明String[] args
  • 预览功能会生成警告,提醒开发者其试验性质。

对初学者的益处

“无类主”特性显著降低了Java的学习门槛:

  • 减少样板代码:传统“Hello, World!”程序包含“编程-in-the-large”概念(如类和静态方法),而新特性让学生专注于“编程-in-the-small”(如变量和控制流)。
  • 渐进学习:学生可先掌握基础,再逐步学习高级概念。
  • 增强兴趣:简化的语法让初学者能快速运行程序,增加学习动力。

教育者无需在课程初期解释复杂的样板代码,可以更专注于教授核心编程逻辑。

Java 23的更新

Java 23进一步优化了该特性,允许省略System.out,直接使用println

void main() {
    println("Hello, world");
}

这是通过编译器自动从java.io.IO类静态导入println方法实现的,简化了输出语句的学习。

未来展望

作为预览功能,“无类主”特性可能在未来版本中调整或稳定。Java团队致力于优化初学者体验,未来可能引入更多简化措施。开发者应密切关注OpenJDK的更新。

结论

Java 21的“无类主”特性通过未命名类和实例主方法,为初学者提供了更简单、直观的编程方式。它减少了样板代码,降低了学习曲线,同时保持了Java的强大功能。对于教育者和学生,这是一个重要的进步;对于开发者,这为编写简单脚本提供了便利。建议使用Java 21或更高版本的开发者尝试这一特性,体验其带来的便捷。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2342248.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

差分信号抗噪声原理:

差分信号抗噪声原理: 差分信号除了能很好地解决发送和接收参考点电位不同的问题外,差分信号的另一个重要优势就是在一定条件下其抗干扰能力比单端信号更强。对于单端信号传输,外界对它的干扰噪声直接叠加在信号上,接收端直接检测输…

6 种AI实用的方法,快速修复模糊照片

照片是我们记录生活的重要方式。但有时,由于各种原因,照片会变得模糊,无法展现出我们想要的效果。幸运的是,随着人工智能(AI)技术的发展,现在有多种方法可以利用 AI 修复模糊照片,让…

从入门到精通【MySQL】视图与用户权限管理

文章目录 📕1. 视图✏️1.1 视图的基本概念✏️1.2 试图的基本操作🔖1.2.1 创建视图🔖1.2.2 使用视图🔖1.2.3 修改数据🔖1.2.4 删除视图 ✏️1.3 视图的优点 📕2. 用户与权限管理✏️2.1 用户🔖…

C++中的next_permutation全排列函数

目录 什么是全排列用法实现原理自定义比较函数 注意事项相关题目1.AB Problem2.P1088 火星人 什么是全排列 全排列是指从一组元素中按照一定顺序(按字典序排列)取出所有元素进行排列的所有可能情况。 例如,对于集合{1,2,3},它的全排列包括&a…

修改el-select背景颜色

修改el-select背景颜色 /* 修改el-select样式--直接覆盖默认样式(推荐) */ ::v-deep .el-select .el-input__inner {background-color: #1d2b72 !important; /* 修改输入框背景色 */color: #fff; } ::v-deep .el-select .el-input__wrapper {background-…

YOLOv8融合CPA-Enhancer【提高恶略天气的退化图像检测】

1.CPA介绍 CPA-Enhancer通过链式思考提示机制实现了对未知退化条件下图像的自适应增强,显著提升了物体检测性能。其插件式设计便于集成到现有检测框架中,并在物体检测及其他视觉任务中设立了新的性能标准,展现了广泛的应用潜力。 关于CPA-E…

Python 项目环境配置与 Vanna 安装避坑指南 (PyCharm + venv)

在进行 Python 项目开发时,一个干净、隔离且配置正确的开发环境至关重要。尤其是在使用像 PyCharm 这样的集成开发环境 (IDE) 时,正确理解和配置虚拟环境 (Virtual Environment) 是避免许多常见问题的关键。本文结合之前安装 Vanna 库时遇到的问题&#…

线上助农产品商城小程序源码介绍

基于ThinkPHPFastAdminUniApp开发的线上助农产品商城小程序源码,旨在为农产品销售搭建一个高效、便捷的线上平台,助力乡村振兴。 一、技术架构 该小程序源码采用了ThinkPHP作为后端框架,FastAdmin作为快速开发框架,UniApp作为跨…

基于Matlab的车牌识别系统

1.程序简介 本模型基于MATLAB,通过编程创建GUI界面,基于Matlab的数字图像处理,对静止的车牌图像进行分割并识别,通过编写matlab程序对图像进行灰度处理、二值化、腐蚀膨胀和边缘化处理等,并定位车牌的文字,实现字符的…

探索 CameraCtrl模型:视频生成中的精确摄像机控制技术

在当今的视频生成领域,精确控制摄像机轨迹一直是一个具有挑战性的目标。许多现有的模型在处理摄像机姿态时往往忽略了精准控制的重要性,导致生成的视频在摄像机运动方面不够理想。为了解决这一问题,一种名为 CameraCtrl 的创新文本到视频模型…

【计算机视觉】CV实战项目- 深度解析FaceAI:一款全能的人脸检测与图像处理工具库

深度解析FaceAI:一款全能的人脸检测与图像处理工具库 项目概述核心功能与技术实现1. 人脸检测与识别2. 数字化妆与轮廓标识3. 性别与表情识别4. 高级图像处理 实战指南:项目运行与开发环境配置典型应用示例常见问题与解决方案 学术背景与相关研究项目扩展…

Cephalon端脑云:神经形态计算+边缘AI·重定义云端算力

前引:当算力不再是“奢侈品” ,在人工智能、3D渲染、科学计算等领域,算力一直是横亘在个人与企业面前的“高墙”。高性能服务器价格动辄数十万元,专业设备维护成本高,普通人大多是望而却步。然而,Cephalon算…

Redis的过期删除策略和内存淘汰策略

🤔 过期删除和内存淘汰乍一看很像,都是做删除操作的,这么分有什么意思? 首先,设置过期时间我们很熟悉,过期时间到了,我么的键就会被删除掉,这就是我们常认识的过期删除,…

MySQL:数据库设计

目录 一、范式 二、第一范式 二、第二范式 三、第三范式 四、设计 (1)一对一关系 (2)一对多关系 (3)多对多关系 一、范式 数据库的范式是一种规则(规范),如果我们…

synchronized关键字的实现

Java对象结构 synchronized锁升级过程 为了优化synchronized锁的效率,在JDK6中,HotSpot虚拟机开发团队提出了锁升级的概念,包括偏向锁、轻量级锁、重量级锁等,锁升级指的就是“无锁 --> 偏向锁 --> 轻量级锁 --> 重量级…

opencv 图像的旋转

图像的旋转 1 单点旋转2. 图片旋转(cv2.getRotationMatrix2D)3. 插值方法3.1 最近邻插值(cv2.INTER_NEAREST)3.2 双线性插值(cv2.INTER_LINEAR)3.3 像素区域插值(cv2.INTER_AREA)3.4 双三次插值(cv2.INTER_CUBIC&#…

【多线程】线程互斥 互斥量操作 守卫锁 重入与线程安全

文章目录 Ⅰ. 线程互斥概念Ⅱ. 互斥锁的概念Ⅲ. 互斥锁的接口一、互斥锁的定义二、初始化互斥锁三、销毁互斥锁四、互斥量的加锁和解锁① 加锁接口② 解锁接口五、改进买票系统💥注意事项Ⅳ. 互斥锁的实现原理一、问题引入二、复习知识三、实现原理Ⅴ. 封装锁对象 &&…

空闲列表:回收和再利用

空闲列表:回收和再利用 手动与自动内存管理 手动管理:程序员需要明确地分配和释放内存。自动管理:例如使用垃圾收集器(GC),它能够自动检测并回收未使用的对象,不需要程序员干预。 对于某些数据结构如B树,…

计算机组成与体系结构:直接内存映射(Direct Memory Mapping)

目录 CPU地址怎么找到真实的数据? 内存映射的基本单位和结构 1. Pages(页)——虚拟地址空间的基本单位 2. Frames(页框)——物理内存空间的基本单位 3. Blocks(块)——主存和缓存之间的数据…

STM32提高篇: 蓝牙通讯

STM32提高篇: 蓝牙通讯 一.蓝牙通讯介绍1.蓝牙技术类型 二.蓝牙协议栈1.蓝牙芯片架构2.BLE低功耗蓝牙协议栈框架 三.ESP32-C3中的蓝牙功能1.广播2.扫描3.通讯 四.发送和接收 一.蓝牙通讯介绍 蓝牙,是一种利用低功率无线电,支持设备短距离通信的无线电技…