为什么Java接口即使可以单独拥有静态方法,却不能有静态初始化块呢?


Java中的接口类似于类,但它只包含抽象方法和声明为final和static的字段。

静态方法使用static关键字声明,它将与类一起加载到内存中。您可以使用类名访问静态方法,而无需实例化。

Java 8 中的接口静态方法

从Java 8开始,您可以在接口中拥有静态方法(带方法体)。您需要使用接口名称来调用它们,就像类的静态方法一样。

示例

在下面的示例中,我们在接口中定义了一个静态方法,并从实现该接口的类中访问它。

interface MyInterface{
   public void demo();
   public static void display() {
      System.out.println("This is a static method");
   }
}
public class InterfaceExample{
   public void demo() {
      System.out.println("This is the implementation of the demo method");
   }
   public static void main(String args[]) {
      InterfaceExample obj = new InterfaceExample();
      obj.demo();
      MyInterface.display();
   }
}

输出

This is the implementation of the demo method
This is a static method

静态块

静态块是一段带有static关键字的代码块。通常,它们用于初始化静态成员。JVM在类加载时,在main方法之前执行静态块。

public class MyClass {
   static{
      System.out.println("Hello this is a static block");
   }
   public static void main(String args[]){
      System.out.println("This is main method");
   }
}

输出

Hello this is a static block
This is main method

接口中的静态块

主要的是,如果您在声明时没有初始化类/静态变量,则可以使用静态块来初始化它们。

对于接口,当您在其中声明一个字段时,必须为其赋值,否则会生成编译时错误。

示例

interface Test{
   public abstract void demo();
   public static final int num;
}

编译时错误

Test.java:3: error: = expected
   public static final int num;
                              ^
1 error

当您为接口中的static final变量赋值时,这将得到解决。

interface Test{
   public abstract void demo();
   public static final int num = 400;
}

因此,接口中不需要静态块。

更新于:2019年8月5日

2K+ 浏览量

启动您的职业生涯

通过完成课程获得认证

开始学习
广告