有两个接口,并且具有最终的公共变量。
interface abc {
int a = 10;
public void display();
}
interface xyz {
int a = 20;
public void display();
}
public class NewClass implements abc, xyz {
public NewClass() {
System.out.println(a);
}
public static void main(String[] args) {
NewClass obj = new NewClass();
obj.display();
}
@Override
public void display() {
System.out.println("hello");
}
}
答案 0 :(得分:3)
您将未知引用到构造函数变量a
。你必须这样做:
System.out.println(xyz.a);
或
System.out.println(abc.a);
取决于您要打印的确切a
。
答案 1 :(得分:2)
此字段a不明确,您无法实现2个相同的字段。此外 - 默认情况下,接口变量是静态和最终的。你甚至不需要将它们设置为静态决赛。
答案 2 :(得分:1)
a
的引用是不明确的,因为它存在于NewClass
实现的两个接口中。
要解决此问题,您需要指定要引用的变量。
使用System.out.println(abc.a)
引用abc
界面或System.out.println(xyz.a)
中的变量来引用xyz
答案 3 :(得分:1)
由于编译器不够智能,无法知道您要访问哪个最终变量,所以您可以告诉他使用哪个接口的final
变量。
你必须像这样指定
System.out.println(xyz.a);
或
System.out.println(abc.a);
答案 4 :(得分:0)
a是"含糊不清的"。它可以属于xyz或abc。这就是编译器尖叫的原因。
请参阅此代码:
public NewClass() {
System.out.println(a); // a is "ambiguous". It could belong to either xyz or abc. That's why the compiler screams
}
更改您的代码以指定必须使用哪个接口。如此
public NewClass() {
System.out.println(xyz.a);
}
答案 5 :(得分:0)
这就是命名空间冲突。
如果接口做了类似的事情,你应该从另一个扩展。如果没有,您应该以不同的方式命名方法。
interface abc {
public void display();
}
interface xyz extends abc {
int a = 20;
}
此外,如果接口中的默认方法不严格需要公共字段,则不应在接口中定义它们,而应在实现类中定义它们。否则给他们一个恰当的名字。
或者像这样访问变量/方法:
public NewClass() {
System.out.println(xyz.a);
}
但在我的选择中这是不好的做法..
答案 6 :(得分:0)
如果您想在界面NewClass
或abc
中使用变量'a',那么在课程xyz
中没有任何变量'a',
public NewClass() {
System.out.println(abc.a);
}
OR
public NewClass() {
System.out.println(xyz.a);
}