实现带变量接口的类是否会独立存储接口变量?
接口中变量的存储机制解析
在Java里,接口中定义的变量默认自带public static final修饰符——哪怕你没手动写,编译器也会自动加上这三个关键字。针对你的疑问,结论很明确:
- 这些变量只在接口中存储一次,不会在每个实现类里生成独立副本。
- 实现类之所以能直接调用接口里的变量,是编译器做了语法糖处理:把你写的变量名自动替换成
接口名.变量名,本质还是访问接口本身的静态变量,并非实现类自己持有这个变量。 - 举个代码示例直观理解:
// 定义接口 public interface GlobalInfo { String GLOBAL_KEY = "SHARED_VALUE"; } // 实现类1 public class ServiceA implements GlobalInfo { public void useKey() { // 编译后实际是 GlobalInfo.GLOBAL_KEY System.out.println(GLOBAL_KEY); } } // 实现类2 public class ServiceB implements GlobalInfo { public void printKey() { // 同样是访问接口的静态变量,没有自己的副本 System.out.println(GLOBAL_KEY); } } - 不管有多少个类实现该接口,这些变量只会在接口加载时初始化一次,存储在方法区的静态常量池中,所有实现类共享这一份数据。
内容的提问来源于stack exchange,提问作者Adrian Olguin
相关产品推荐
相关产品推荐

