为什么这段代码使用接口给我编译时错误以及我如何实现这段代码?请解释?

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

中的变量

这是the diamond of death

因为 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);
}