Java编译器是否会在接口的.class文件中生成构造器?
回答:Java编译器不会为接口生成构造器
咱们先直接给结论:Java编译器绝对不会在接口的.class文件中创建构造器,原因可以从Java规范、接口的本质和字节码验证三个角度来解释:
接口的本质与Java规范限制
接口的设计初衷是定义一组行为规范,它本身不能被实例化,也不允许显式定义构造器——这是Java语言规范明确规定的。既然接口永远不会被用来创建实例,编译器自然没有必要为它生成构造器,这完全不符合设计逻辑。对比类的默认构造器逻辑
类如果没有显式定义构造器,编译器会自动生成一个默认无参构造器,这是因为类需要通过构造器来初始化实例。但接口不存在“实例初始化”的场景,所以这条规则不适用于接口。字节码层面的验证
你可以用javap命令反编译接口的.class文件来验证这一点。比如针对你代码里的X接口,编译后执行javap -c X,输出里只会看到接口的声明信息,完全找不到构造器相关的字节码指令。
另外再补充一下你代码里的逻辑:X x = new Y()之所以合法,是因为你实例化的是类Y,编译器会为Y生成默认无参构造器,真正被调用的是Y的构造器。X只是一个类型引用,用来约束x可以调用的方法,和接口本身有没有构造器毫无关系——这就是Java多态的典型体现,接口作为父类型,只是承担“类型标识”的作用,不需要自己具备实例化能力。
内容的提问来源于stack exchange,提问作者Moses
相关产品推荐
相关产品推荐

