繁体   English   中英

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

[英]Why this code give me compile Time error using Interface and how i can implement this code? Please Explain?

有两个接口,并且具有最终变量。

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个相同的字段。 另外-接口变量默认为静态和最终变量。 您甚至不需要将它们设置为静态final。

由于在NewClass实现的两个接口中都存在对a引用,因此模棱两可。

要解决此问题,您需要指定要引用的变量。

使用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是“模棱两可”的。 它可以属于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);
    }

多数民众赞成在名称空间冲突。

如果接口做类似的事情,则应该彼此扩展。 如果不是,则应使用不同的方法命名。

interface abc {
    public void display();
}

interface xyz extends abc {
    int a = 20;
}

另外,如果接口中的默认方法并非严格要求公共字段,则不应在接口中定义它们,而应在实现类中定义它们。 否则给他们一个适当的唯一名称。

或像这样访问变量/方法:

public NewClass() {
    System.out.println(xyz.a);
}

但我认为这是不好的做法。

如果要使用接口abcxyz变量“ a”,则在NewClass类中没有任何变量“ a”,

public NewClass() {
    System.out.println(abc.a);
}

要么

public NewClass() {
    System.out.println(xyz.a);
}

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM