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),他们正在写:
- "您可以通过扩展 class 或 通过实现接口 在 Java 中创建继承 关系"(第 76 页)
- “任何实现接口的 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符号。
当然,您可以用您喜欢的任何名称来称呼这些(以及更多)语言功能中的任何一个,但如果这会引起误解,请不要感到惊讶。
我在问自己,Java 中的接口是否继承了它的常量?!
我正在阅读“OCP Java SE Programmer II 考试指南”(Oracle Press,ISBN:978-1-260-11738-7),他们正在写:
- "您可以通过扩展 class 或 通过实现接口 在 Java 中创建继承 关系"(第 76 页)
- “任何实现接口的 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符号。
当然,您可以用您喜欢的任何名称来称呼这些(以及更多)语言功能中的任何一个,但如果这会引起误解,请不要感到惊讶。