【发布时间】:2019-04-08 04:12:24
【问题描述】:
interface Z{ int x = 10;}
Class A implements Z{}
Class B implements Z{}
这种情况下java如何使用x?
java 是否会生成 x 的单个副本,因为 x 是静态最终的? 还是 A 类和 B 类的不同副本?
【问题讨论】:
interface Z{ int x = 10;}
Class A implements Z{}
Class B implements Z{}
这种情况下java如何使用x?
java 是否会生成 x 的单个副本,因为 x 是静态最终的? 还是 A 类和 B 类的不同副本?
【问题讨论】:
正如 JLS 所说about static fields:
如果一个字段被声明为静态的,那么就只存在一个 字段,无论该类有多少实例(可能为零) 最终可能会被创建。
一个类从它的直接超类和直接超接口继承 超类和超接口的所有非私有字段 类中的代码都可以访问,并且不会被 类中的声明。
静态字段继承没有特殊情况,所以它们也必须被继承。
我们不能用接口编写一个很好的代表性代码示例,因为它的变量被隐式声明为 static final。所以,让我们用超类写一个示例。假设我们有:
class Base {
static int x = 15;
}
class A extends Base {}
class B extends Base {}
x 变量是Base 类的共享部分。如果我们从 IS-A 关系的角度考虑继承,那么A(或B)就是Base。那么x 是A、B 和Base 的共享部分。和简单的演示:
public class DemoApplication {
public static void main(String[] args) {
System.out.println(A.x++);
System.out.println(B.x);
}
}
输出:
15
16
如您所见,超类与子类共享一个静态变量。有了界面,实际上什么都没有改变。
【讨论】: