为什么Java 8中的接口允许使用main方法?

Cod*_*roc 32 java java-8

为什么允许接口main在Java 8中使用方法?

如下面的代码所述,它工作正常并正确产生输出.

public interface Temp {
    public static void main(String args[]){
         System.out.println("Hello");
    }
}
Run Code Online (Sandbox Code Playgroud)

目前它表现得像一个类,我interface用main方法执行.

我们为什么需要这个?

JB *_*zet 36

从Java 8开始,接口中允许使用静态方法.

main()是一个静态方法.

因此,接口中允许使用main().

我们不需要这个,因为以前不允许这样做,但我们幸存了下来.但是,根据定义,静态方法不是绑定到类的实例,而是绑定到类本身,因此在接口中允许它们是有意义的.它允许Collections在接口本身中定义与接口相关的实用程序方法(例如,在接口中找到的),而不是单独的类.

类静态方法和接口静态方法之间没有区别.

  • 类和接口上的静态方法之间至少存在一个小的区别:类上的静态方法可以由子类"继承",但接口上的静态方法不会被任何子类型继承. (5认同)
  • @StuartMarks,静态方法的继承只是一个编译器魔术,因为声明相同签名的方法会影响超类中的静态方法.在字节代码中,静态方法只是通过类+方法上的完全限定调用来调用. (4认同)

cru*_*tex 13

我是@ jb-nizet的答案.对此没有"绝望的需求",但它消除了不必要的限制.例如,您现在可以在界面中声明一个工厂方法:

 public interface SomeService {

   public static SomeService getInstance() {
     // e.g. resolve via service provider interface
   }

   ...

 }
Run Code Online (Sandbox Code Playgroud)

在Java 8之前,我们总是需要一个单独的工厂类.一个最喜欢的例子是谷歌应用引擎API.

  • 因此,在接口上使用主方法的合理用法是调用factiry来获取对象,然后委托该对象来执行程序的操作. (4认同)

小智 7

在Java 8中,接口可以具有静态方法.由于main方法也是静态方法,因此它将允许它.

我们可以使用这些静态方法声明常见的辅助方法.