为什么Java8中承载main的接口不必是公共的?

为什么Java8中承载main的接口不必是公共的?,java,interface,java-8,main,static-methods,Java,Interface,Java 8,Main,Static Methods,为什么以下代码在Java8+eclipse中编译并成功运行 package package1; interface A { static void main(String[] args) { System.out.println("Hi"); } } 如果将更改为类,则运行时要求它是公共类,但对于接口则不是这样。这似乎不一致 编辑:我在发布问题时所做的上述陈述是错误的。(我一定是累了,误读了错误)。Java不要求宿主main的类是公共的,只要求方法是公共的。

为什么以下代码在Java8+eclipse中编译并成功运行

package package1;
interface A  
{
    static void main(String[] args) {
        System.out.println("Hi");
    }
}
如果将更改为类,则运行时要求它是公共类,但对于接口则不是这样。这似乎不一致

编辑:我在发布问题时所做的上述陈述是错误的。(我一定是累了,误读了错误)。Java不要求宿主main的类是公共的,只要求方法是公共的。 但是,托管main的类型不必是公共的,而main方法必须是公共的,这有点不一致

如果将更改为类,则运行时要求它是公共类

不,没有。它要求方法是公共的,并且接口中的方法已经是公共的

但对于接口来说并非如此

不是这样

这似乎不一致


事实并非如此。您误读了错误消息。

接口及其字段和方法始终是公共的

如果A是包含main方法的类,则A必须是公共的。这是因为主要方法始终是

public static void main(String[] args)

在java 1.8之前的版本中,不允许使用静态方法

默认情况下,所有方法都是公共的,因此不必显式使用关键字

interface myInterface {
public void show();
//same as above
 void show();
}
从Java8开始,接口还可以有
静态方法

因此,您可以使用
静态
方法,但不需要
公共
关键字

interface myInterface {
static void main(String[] args) {}
void show();
}

默认情况下,所有接口成员都是公共的。该类不必是公共的。方法是。接口是隐式的
公共的
静态的
是关于类型还是方法的问题?接口不是隐式的公共的。他们的方法很简单。结果表明,运行时不要求类型为public,只要求main方法。包含的类不需要为public,并且最后一句是非sequeur。