【问题标题】:How fields are added from interface to class in Java?Java中如何将字段从接口添加到类?
【发布时间】: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 类的不同副本?

【问题讨论】:

标签: java interface


【解决方案1】:

正如 JLS 所说about static fields

如果一个字段被声明为静态的,那么就只存在一个 字段,无论该类有多少实例(可能为零) 最终可能会被创建。

关于fields inheritance

一个类从它的直接超类和直接超接口继承 超类和超接口的所有非私有字段 类中的代码都可以访问,并且不会被 类中的声明。

静态字段继承没有特殊情况,所以它们也必须被继承。

我们不能用接口编写一个很好的代表性代码示例,因为它的变量被隐式声明为 static final。所以,让我们用超类写一个示例。假设我们有:

class Base {
    static int x = 15;
}

class A extends Base {}

class B extends Base {}

x 变量是Base 类的共享部分。如果我们从 IS-A 关系的角度考虑继承,那么A(或B)就是Base。那么xABBase 的共享部分。和简单的演示:

public class DemoApplication {

    public static void main(String[] args) {
        System.out.println(A.x++);
        System.out.println(B.x);
    }
}

输出:

15
16

如您所见,超类与子类共享一个静态变量。有了界面,实际上什么都没有改变。

【讨论】:

  • 您可能希望将 JLS 链接更新到当前版本 (12)。不过只是一个非常小的注释。
  • @Zabuza 我有点落后于时代)谢谢,已更新。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2016-12-29
  • 2010-11-16
  • 2014-11-16
  • 1970-01-01
  • 2021-10-04
  • 2018-03-13
  • 1970-01-01
相关资源
最近更新 更多