Java 中的实现 class 是否继承了接口常量?

Does in Java an implementing class inherits the interface constants or not?

我在问自己,Java 中的接口是否继承了它的常量?!

我正在阅读“OCP Java SE Programmer II 考试指南”(Oracle Press,ISBN:978-1-260-11738-7),他们正在写:

  1. "您可以通过扩展 class 或 通过实现接口 在 Java 中创建继承 关系"(第 76 页)
  2. “任何实现接口的 class 都可以直接访问常量,就像 class 继承了它们一样”(第 12 页)

这不是自相矛盾吗?

示例:

public interface InterfaceA2 {

    int NUMBER = 100;
}

class A2 {
    
    public static void main(String[] args) {
        
        // System.out.println(NUMBER);  // compiler error
        System.out.println(InterfaceA2.NUMBER);
    }
}

class B2 implements InterfaceA2 {
    
    public static void main(String[] args) {
        System.out.println(NUMBER); // <------------------ looks like inheritance?!
        System.out.println(InterfaceA2.NUMBER);
    }
}

这一切都归结为您如何定义“继承”一词的问题。

  • 一个 class 的实例不仅可以用它自己的方法调用,而且可以用它的任何超class 中声明的所有方法调用。你愿意称之为“继承”吗? Java 社区就是这样做的。

  • class 的实例不仅有它自己声明的字段,还有在它的任何超class 中声明的所有字段。你愿意称之为“继承”吗? Java 社区就是这样做的。

  • 一个子class隐含地拥有它的超级class的所有特征,例如它实现了哪些接口。你愿意称之为“继承”吗? Java 社区就是这样做的。

  • 实现接口的class将拥有接口中声明的所有方法。你愿意称之为“继承”吗? Java 社区称之为“实现接口”,而不是“继承”。 [我有点惊讶 Oracle 书中似乎也在这里使用术语“继承”。]

  • 在实现接口的 class 中,您可以通过简单名称访问在接口中声明的常量,而无需在常量前加上接口名称前缀。你愿意称之为“继承”吗? Java社区没有,它只是一个shorthand符号。

  • 当导入像 import java.awt.* 这样的包时,您可以通过它们的简单名称访问 classes,而不需要在它们前面加上它们的包名称。你愿意称之为“继承”吗? Java社区没有,它只是一个shorthand符号。

当然,您可以用您喜欢的任何名称来称呼这些(以及更多)语言功能中的任何一个,但如果这会引起误解,请不要感到惊讶。