java - 如果同名字段继承自两个源(类和接口(interface))会发生什么

标签 java inheritance interface field implementation

有效代码:

interface Int1{
    String str = "123";
}
class Pparent{
    String str = "123";  
}
class F extends Pparent implements Int1{       
}

无效代码

在F类中添加main方法:

class F extends Pparent implements Int1{
      public static void main(String[] args) {
        System.out.println(str);
    } 
}

出局

Exception in thread "main" java.lang.Error: Unresolved compilation problem: 
  The field str is ambiguous

  at test.core.F.main(NullReferenceTest.java:45)

我没有看到这两种变体之间有显着的差异。 我准备scjp并要求澄清所有相关情况。当我看到熟悉的问题时,我很困惑。

你能澄清一下共同规则吗?

最佳答案

标识符 str 可以引用两个字段 - 一个是从 Int1 继承的静态字段,另一个是从 Pparent 继承的实例字段。尽管尝试使用静态上下文中的实例是无效的,但该名称仍然可以解析。 (如果 Pparent.str 是静态的,您仍然会收到错误消息。)

这两个字段都没有隐藏另一个字段,因为它们是从不同的 parent 那里继承的 - 所以这个名字是不明确的。编译器提示是因为它不知道您指的是哪个字段。

如果您想要 Int1 中的一个,只需限定它即可:

System.out.println(Int1.str);

如果您想要 Pparent 中的一个,您应该创建一个实例并将其强制转换为 Pparent 以表明您引用接口(interface)字段:

System.out.println(((Pparent) new F()).str);

显然,这很可怕,您应该首先避免陷入这种情况。这部分是通过将所有字段设为私有(private)(常量除外)来实现的。在父类(super class)和要实现的接口(interface)中出现两个名称完全相同的常量是非常不寻常的。

关于java - 如果同名字段继承自两个源(类和接口(interface))会发生什么,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23810509/

相关文章:

java - 这个符号在 IntelliJ 中意味着什么? Java 类名上的照明符号

java - JSF 不报告未定义的 bean

class - 使用其他方法创建 Ocaml 子类的正确方法是什么?

java - 将子类对象添加到 ArrayList<Base Class>

c# - 是不是违反了c#接口(interface)的设计原则?

Java SQL 字符串删除 GROUP BY 中的重复项

java - 对齐两个 Javafx GridPane

c++ - C++中的类继承

iphone - 如何获取 CGRect 的 x 和 y 来初始化带有框架的控件?

android - TypedValue 在 Android 中的工作