当前位置: 首页 > article >正文

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

在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或更高版本的开发者尝试这一特性,体验其带来的便捷。

相关文章:

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

在Java编程中,编写一个简单的“Hello, World!”程序通常需要以下代码: public class HelloWorld {public static void main(String[] args) {System.out.println("Hello, World!");} }这种结构包含了许多对初学者来说难以理解的概念&#xff…...

AI | 最近比较火的几个生成式对话 AI

关注:CodingTechWork 引言 生成式对话 AI 正在迅速改变我们与机器交互的方式,从智能助手到内容创作,其应用范围广泛且深远。本文将深入探讨几款当前热门的生成式对话 AI 模型,包括 Kimi、DeepSeek、ChatGPT、文心一言、通义千问和…...

差分信号抗噪声原理:

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

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

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

JavaScript 的“积木”:函数入门与实践

引言:告别重复,拥抱模块化 想象一下,你在写代码时发现,有几段逻辑几乎一模一样,需要在不同的地方反复使用。你是选择每次都复制粘贴,还是希望能像搭积木一样,把这段逻辑封装起来,需…...

从入门到精通【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-…...

dockercompose文件仓库

mysql version: 3 # 使用docker-compose的版本,根据需要可以调整# 创建数据目录 # mkdir -p /home/docker/mysql/mysql_data # mkdir -p /home/docker/mysql/mysql_logs # 给予适当的权限(确保MySQL容器可以读写这些目录) # chmod 777 /ho…...

【C++入门:类和对象】[3]

C入门:类和对象 拷贝构造(拷贝初始化) 拷贝构造是构造函数的重载 class Date { public:Date(int year1,int month1,int day1) { _yearyear; _monthmonth; _dayday; } Date(const Date& d)//(拷贝构造,把d1传参给d)引用传参不改变使用const //注意使用&,不然会无穷递…...

【mdlib】0 全面介绍 mdlib - Rust 实现的 Markdown 工具集

mdlib 是由开发者 bahdotsh 创建的一个多功能 Markdown 工具集合,包含两个主要组件:一个轻量级 Markdown 解析库和一个功能完善的个人 Wiki 系统。该项目完全采用 Rust 实现,兼具高性能与跨平台特性。 核心组件 Markdown 解析库 特性&#…...

今日CSS学习浮动->定位

------------------------------------------------------------------------------------------------------- CSS的浮动 float 属性用于创建浮动框,将其移动到一边,直到左边缘或右边缘触及包含块或另一个浮动框的边缘。 float 属性定义元素在哪个方向浮…...

如何实现Spring Boot应用程序的安全性:全面指南

在现代 Web 开发中,安全性是 Spring Boot 应用程序的核心需求,尤其是在微服务、云原生和公开 API 场景中。Spring Boot 结合 Spring Security 提供了一套强大的工具,用于保护应用程序免受常见威胁,如未经授权的访问、数据泄露、跨…...

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

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

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

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

第52讲:农业AI + 区块链——迈向可信、智能、透明的未来农业

目录 一、为什么农业需要“AI+区块链”? 二、核心应用场景解读 1. 农产品溯源系统 2. 农业信贷与保险精准评估 3. 农业碳足迹追踪与碳汇交易 三、案例实战分享:智能溯源 + 区块链合约 四、面临挑战与展望 五、总结 在数字农业时代,“AI” 和 “区块链” 是两股不容忽…...

模板偏特化 (Partial Specialization)

C 模板偏特化 (Partial Specialization) 模板偏特化允许为模板的部分参数或特定类型模式提供定制实现,是 静态多态(Static Polymorphism) 的核心机制之一。以下通过代码示例和底层原理,全面解析模板偏特化的实现规则、匹配优先级…...

【防火墙 pfsense】1简介

(1) pfSense 有以下可能的用途: 边界防火墙 路由器 交换机 无线路由器 / 无线接入点 (2)边界防火墙 ->要充当边界防火墙,pfSense 系统至少需要两个接口:一个广域网(WAN&#xff0…...

Qt UDP组播实现与调试指南

在Qt中使用UDP组播(Multicast)可以实现高效的一对多网络通信。以下是关键步骤和示例代码: 一、UDP组播核心机制 组播地址:使用D类地址(224.0.0.0 - 239.255.255.255)TTL设置:控制数据包传播范围(默认1,同一网段)网络接口:指定发送/接收的物理接口二、发送端实现 /…...

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

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

【maven-7.1】POM文件中的属性管理:提升构建灵活性与可维护性

在Maven项目中,POM (Project Object Model) 文件是核心配置文件,而属性管理则是POM中一个强大但常被低估的特性。良好的属性管理可以显著提升项目的可维护性、减少重复配置,并使构建过程更加灵活。本文将深入探讨Maven中的属性管理机制。 1.…...

基于Matlab的车牌识别系统

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

three.js精灵及精灵材质、Shader源码分析

在Three.js中,Sprite(精灵)用于创建始终面向相机的2D元素,适用于标签、图标或粒子效果。本文将分析其源码及Shader实现。 1. sprite的基本使用方法 创建精灵材质: 精灵材质有个特殊的参数rotation,可以让其旋转一定的角度。 const material = new THREE.SpriteMateria…...

Kubernetes Docker 部署达梦8数据库

Kubernetes & Docker 部署达梦8数据库 一、达梦镜像获取 目前达梦官方暂未在公共镜像仓库提供Docker镜像,需通过达梦官网联系获取官方镜像包。 二、Kubernetes部署方案 部署配置文件示例 apiVersion: apps/v1 kind: Deployment metadata:labels:app: dm8na…...

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

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

Streamlit从入门到精通:构建数据应用的利器

在数据科学与机器学习日益普及的今天,如何快速将模型部署为可交互的应用成为了许多数据科学家的重要任务。Streamlit,作为一个开源的Python库,专为数据科学家设计,能够帮助我们轻松构建美观且直观的Web应用。本文将从入门到精通&a…...

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

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

快速上手GO的net/http包,个人学习笔记

更多个人笔记:(仅供参考,非盈利) gitee: https://gitee.com/harryhack/it_note github: https://github.com/ZHLOVEYY/IT_note 针对GO中net/http包的学习笔记 基础快速了解 创建简单的GOHTTP服务 func …...

达梦DMDSC初研

1.文件系统 1.1文件系统DMASM DMASM是一个分布式文件系统,用来管理块设备的磁盘和文件,DMASMCMD将物理磁盘格式化后,变成可识别、可管理的 ASM磁盘,再通过 ASM磁盘组将一个或者多个 ASM磁盘整合成一个整体提供文件服务。ASM磁盘…...

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

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