有效代码:
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/