Java简化:隐式类和简化的Main方法


人们批评Java冗长而且对新手不友好。27年后,一个JEP可能会解决这个问题!

目标

  • 为 Java 提供平滑的入口,以便教育工作者可以循序渐进地介绍编程概念。
  • 帮助学生以简洁的方式编写基本程序,并随着他们技能的增长而优雅地增长代码。
  • 减少编写简单程序(例如脚本和命令行实用程序)的仪式。

经典的“Hello World”程序通常被用作 Java 学习者的第一个程序,如下所示:

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

大多数教育工作者认为这里有太多混乱——代码太多、概念太多、结构太多‘

这个 JEP 的动机不仅是为了减少仪式,而且是为了帮助刚接触 Java 或一般编程的程序员以一种按正确顺序介绍概念的方式学习 Java。

去除访问性public/private、static修饰符、String[]参数:

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


隐式类
每个 Java 类都驻留在一个包中,每个包都驻留在一个模块中——它们充当 Java 平台应用于所有代码的命名空间或封装结构。

在类服务于构建对象的模板的主要目的之前,它们仅充当方法和字段的命名空间。
这样,当初学者还在编写简单的、单一文件的时候,就无须面对“类class”的概念。即使每个 Java 方法都驻留在一个类中,我们也可以不再要求对不需要它的代码进行显式类声明。

当 Java 编译器遇到源文件中的方法未包含在类声明中时,它会隐式地将此类方法以及任何未包含的字段和文件中声明的任何类视为未命名隐式类的成员。

隐式类没有名称(更准确地说,将为它选择一个内部的、特定于实现的名称),并且始终是未命名包的成员。它也是final不能实现任何接口,也不能子类化任何类(除了Object)。

请注意,因为隐式类不能通过名称引用,所以它不能使用对其静态方法的方法引用;仍然可以使用this,对实例方法的方法引用也可以。

因为没有类可以通过名称引用隐式类,所以不能直接构造隐式类的实例。隐式类仅作为独立程序或作为程序的入口点有用。因此,隐式类必须具有main可以如上所述启动的方法。

隐式类的成员支持与普通命名类中相同的修饰符(例如staticor volatile)并具有相同的默认值(例如默认package访问和实例成员资格),并且通常以与显式声明类的成员相同的方式运行。隐式类具有默认的无参数构造函数,并且不能有其他构造函数。然而,它可能有一个静态初始化器和一个实例初始化器。

使用隐式类以后,Hello, World现在可以写成:

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

由于“顶级成员”被解释为隐式类的成员,我们也可以将程序写成:

String greeting() { return "Hello, World!"; }

void main() {
    System.out.println(greeting());
}

或者,使用一个字段,如:

String greeting = "Hello, World!";

void main() {
    System.out.println(greeting);
}


这是预览语言功能,默认禁用

要在 JDK 21 中尝试以下示例,您必须启用预览功能,如下所示:

  • 用javac --release 21 --enable-preview Main.java编译程序,用java --enable-preview Main运行程序;或者。
  • 当使用源代码启动器source code launcher,时,用java --source 21 --enable-preview Main.java运行程序。