java 接口 初始化_[Java] 类和接口的初始化步骤 - 继承方面

本文详细介绍了Java中类和接口在初始化时的不同处理方式。当通过引用static字段触发初始化,类会初始化声明该字段的类及其父类,而接口只会初始化声明字段的接口,不包括父接口。示例代码展示了这一行为,帮助读者理解Java初始化机制。
摘要由CSDN通过智能技术生成

类和接口在初始化化时,处理继承层级的方法不一样。

类继承的初始化:通过引用 static 字段,触发某个类的初始化,则声明该字段的类,以及该类的父类被初始化。

接口继承的初始化:通过引用 static 字段,触发某个接口的初始化,则声明该字段的接口会被初始化,但该接口的父接口不会被初始化。

想了解其他触发类初始化的方法,可参看另一篇博文 类的初始化步骤 。

注意一点,接口字段全部隐式地被修饰为 public, static, final 。因此,所有的接口字段实际上都是 static 的,无论有没有显示地声明 static 。这点和接口无法被实例化规定是相吻合的。

类继承的初始化例子

Super, 父类。

C, 继承 Super 类。

Sub, 继承 C 类。

InitDemo, 演示类继承的初始化。

packageexecution.initializationExtends;public classSuper {static String superName = "superName";static{

System.out.println(" initializing Super ");

}

}

packageexecution.initializationExtends;public class C extendsSuper{static String cName = "cName";static{

System.out.println(" initializing C ");

}

}

packageexecution.initializationExtends;public class Sub extendsC{static{

System.out.println(" initializing Sub ");

}

}

InitDemo 演示类继承的初始化,通过引用类的变量,触发类被初始化。需要注意的是,在这里 cName 字段的声明类是 C 类,不是 Sub 类。

packageexecution.initializationExtends;public classInitDemo {public static voidmain(){

System.out.println(Sub.cName);

}

}

输出

initializing Super

initializing C

cName

根据初始化可见,只有 static 字段的声明类 C ,以及其父类 Super 被初始化了,输出代码中 Sub 类没有被初始化。

接口继承的初始化例子

Output,用于输出接口初始化的情况。由于接口内不能直接带静态代码块,所有通过 Output 类输出接口的初始化情况。

SuperI, 接口父类;

I, 继承 SuperI 接口;

SubI, 继承 I 接口。

InitIDemo,演示接口继承的初始化。

packageexecution.initializationExtendsI;public classOutput {public staticString printWhenInit(String s){

System.out.println(s);return s.substring(s.indexOf(" "));

}

}

packageexecution.initializationExtendsI;public interfaceSuperI {public static String superField = Output.printWhenInit(" initializing SuperI.superField ");

}

packageexecution.initializationExtendsI;public interface I extendsSuperI{public static String iField = Output.printWhenInit("initializing I.iField ");

}

packageexecution.initializationExtendsI;public interface SubI extendsI {public static String subField = Output.printWhenInit(" initializing SubI.subField ");

}

和前面的类继承初始化例子相似,iField 字段的声明接口不是 SubI, 而是 I 。

packageexecution.initializationExtendsI;public classInitIDemo {public static voidmain(){

System.out.println(SubI.iField);

}

}

输出

initializing I.iField

I.iField

由输出可见,只有 iField 字段的声明接口 I 被初始化了。输出代码的 SubI 、父接口 SuperI 都没有被初始化。

参考资料

9.3 Field (Constant) Declarations, The Java Language Specification, Java SE 8 Edition

12.4.1 When Initialization Occurs, The Java Language Specification, Java SE 8 Edition

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值