接口的<cinit>

public interface SuperInterface {
     int a=5;
}

接口的<cinit>

书上说,接口也会有类构造器方法<clint>,但是用jclasslib看了一下methods中没有,这个怎么理解^_^

回答

我理解是: 这时,java编译器遇到了如下场景:编译器在创建接口类型的匿名类实体的时候,编译器仍然会为接口生成<clinit>() 类构造器,用于初始化接口中所定义的成员变量。


interface SuperInterface{
	int a = 5;
}
public class T{	
 
 public static void main(String args[]){
 	
 	SuperInterface sup = new SuperInterface(){
 		}; //花括号内没有(空)代码。
 	
 	System.out.println(sup.a);
 
 	}
}

DOS 窗口:


D:\java\test\OS_China>javac T.java

D:\java\test\OS_China>java T
5

D:\java\test\OS_China>java -version
java version "1.8.0_162"
Java(TM) SE Runtime Environment (build 1.8.0_162-b12)
Java HotSpot(TM) 64-Bit Server VM (build 25.162-b12, mixed mode)

D:\java\test\OS_China>

上述的构造方法中,没有(空)代码。所以, jclasslib 的 methods中, 不需要定义这个构造方法。

回复
@ruo123 : 我应当学习一下:关于jvm-java中init与clint区别 https://blog.csdn.net/qq_24904257/article/details/91607263综合以上几点接口按理说不会生成<clinit>方法,但是书上又说了接口仍然有变量初始化的赋值操作,所以可以操作,我测试了都没找到哪种情况接口会生成<clinit>方法 = =按照书上所写 1、<clinit>方法是由编译器自动收集类中的所有类变量赋值动作和静态语句块中的语句合并产生的 2、<clinit>对于类和接口不是必须的,没有静态语句块或者变量赋值(类变量)是可不生成<clinit>的 3、接口不能使用静态语句块,接口的变量都是static final 修饰的(也就是常量)

问题的方法名写错了,是<clinit> ,修改不了。- -

当接口中常量以调用方法而非字面量显式初始化时,接口就会生成<clinit>()方法

public interface MyInterface {
    int i = new Random().nextInt();
}