为什么这段代码使用接口给我编译时错误以及我如何实现这段代码?请解释?
Why this code give me compile Time error using Interface and how i can implement this code? Please Explain?
有两个接口,有共同的final变量。
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");
}
}
您向构造函数变量 a
引用了一个未知数。你必须做:
System.out.println(xyz.a);
或
System.out.println(abc.a);
取决于您要打印的确切 a
。
此字段 a 不明确,您不能实现 2 个相同的字段。此外 - 默认情况下,接口变量是静态的和最终的。您甚至不需要将它们设置为静态最终。
a 是 "ambiguous"。它可以属于 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
}
更改您的代码以指定 a 必须来自哪个接口 used.like this
public NewClass() {
System.out.println(xyz.a);
}
那是命名空间冲突。
如果接口做类似的事情,你应该从另一个扩展一个。如果不是,您应该以不同的方式命名这些方法。
interface abc {
public void display();
}
interface xyz extends abc {
int a = 20;
}
此外,如果接口中的默认方法不严格需要公共字段,则不应在接口中定义它们,而应在实现中定义它们 class。否则给他们一个适当的唯一名称。
或者像这样访问变量/方法:
public NewClass() {
System.out.println(xyz.a);
}
但我认为这是不好的做法..
对 a
的引用不明确,因为它出现在 NewClass
实现的两个接口中。
要解决此问题,您需要指定要引用的变量。
使用System.out.println(abc.a)
引用abc
接口中的变量或System.out.println(xyz.a)
引用xyz
中的变量
因为 Compiler 不够聪明,无法知道您要访问哪个最终变量,直到您告诉他要使用哪个接口的 final
变量。
你必须这样指定
System.out.println(xyz.a);
或
System.out.println(abc.a);
'a' 在 class NewClass
中没有任何变量,如果您想使用接口 abc
或 [=14= 中的变量 'a' ],
public NewClass() {
System.out.println(abc.a);
}
或
public NewClass() {
System.out.println(xyz.a);
}
有两个接口,有共同的final变量。
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");
}
}
您向构造函数变量 a
引用了一个未知数。你必须做:
System.out.println(xyz.a);
或
System.out.println(abc.a);
取决于您要打印的确切 a
。
此字段 a 不明确,您不能实现 2 个相同的字段。此外 - 默认情况下,接口变量是静态的和最终的。您甚至不需要将它们设置为静态最终。
a 是 "ambiguous"。它可以属于 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
}
更改您的代码以指定 a 必须来自哪个接口 used.like this
public NewClass() {
System.out.println(xyz.a);
}
那是命名空间冲突。
如果接口做类似的事情,你应该从另一个扩展一个。如果不是,您应该以不同的方式命名这些方法。
interface abc {
public void display();
}
interface xyz extends abc {
int a = 20;
}
此外,如果接口中的默认方法不严格需要公共字段,则不应在接口中定义它们,而应在实现中定义它们 class。否则给他们一个适当的唯一名称。
或者像这样访问变量/方法:
public NewClass() {
System.out.println(xyz.a);
}
但我认为这是不好的做法..
对 a
的引用不明确,因为它出现在 NewClass
实现的两个接口中。
要解决此问题,您需要指定要引用的变量。
使用System.out.println(abc.a)
引用abc
接口中的变量或System.out.println(xyz.a)
引用xyz
因为 Compiler 不够聪明,无法知道您要访问哪个最终变量,直到您告诉他要使用哪个接口的 final
变量。
你必须这样指定
System.out.println(xyz.a);
或
System.out.println(abc.a);
'a' 在 class NewClass
中没有任何变量,如果您想使用接口 abc
或 [=14= 中的变量 'a' ],
public NewClass() {
System.out.println(abc.a);
}
或
public NewClass() {
System.out.println(xyz.a);
}