接口中的主方法(Java-8)

3

由于Java 8允许在接口中使用静态方法,我决定检查一下这样一个简单的编译程序是否能够成功运行:

public interface Test {
    static void main(String[] args) {
        System.out.println("I'm ok!");
    }
}

令我惊讶的是,它运行得非常完美。

我的疑惑在于,在JVM规范术语中,classinterface具有不同的语义和用法。在这种情况下,我担心这种行为是否真正符合JVMS的要求?因为事实上JVMS Ch. 5.2谈到的是class而不是class or interface

Java虚拟机通过使用引导类加载器(§5.3.1)以一种实现相关的方式创建一个初始。然后,Java虚拟机链接初始类,初始化它,并调用公共类方法void main(String[])。

更新:

我知道,接口本身就是一个类。但我谈论的是JVM,其中classinterface经常具有不同的语义。例如

当Java虚拟机创建(§5.3)类或接口时,将构造该类或接口的运行时常量池。


3
接口是一个类。 - Thorbjørn Ravn Andersen
@Andremoniy 在某些情况下可能是这样,但你不会找到“引导接口加载器”的参考资料。 - Andy Turner
2
在JVM中,它们都是.class文件。你不能创建一个抽象类或接口的实例,但现在与过去相比,它们之间的差异并不是那么大了。 - Peter Lawrey
1
顺便说一句,您不能将静态方法添加到注释中。 ;) - Peter Lawrey
1
你也不能将它添加到 package-info.java 文件中。 - Peter Lawrey
显示剩余2条评论
1个回答

3
JVM规范在这里的措辞有点松散。如果您参考引用的第5.3.1节,它说:

使用引导类加载器来加载并创建由N表示的非数组类或接口C的以下步骤。

重点是无论C是类还是接口,都要遵循相同的过程。
Java语言规范在描述虚拟机启动时同样不一致,在一个地方使用“class”,在另一个地方使用“class or interface”。
无论如何,将main方法作为接口的一部分应该完全可行。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接