相同的最终变量在两个接口中声明并在一个类中实现

时间:2013-10-04 18:11:24

标签: java

您好我有两个接口 Ainterface Binterface 具有与' i '相同的静态最终变量,声明为 10 < / strong>和 20 ,我正在实现这两个接口两个我的类 InterfaceCheck ,其中我声明相同的接口变量为static和final并初始化为 30 < / strong>即可。当我尝试在我的班级中打印 i 的值时,我得到30作为输出。可以有人解释我为什么我能够将 i 重新初始化为其他值,即使它是最终变量。

CODE

public interface Ainterface {

    public final static int i=10;

}

public interface Binterface {

    public static final int i=20;

}


public class InterfaceCheck implements Ainterface,Binterface {

    public static final int i=30;   

    public static void main(String[] args) {        
        System.out.println(i);
    }

}

&GT;&GT;输出:30

4 个答案:

答案 0 :(得分:11)

类字段始终在引用的静态类型上解析。

public static void main(String[] args) {        
    System.out.println(i);
}

隐含地

System.out.println(InterfaceCheck.i);

这就是你所看到的。

此外,不会继承静态字段。

答案 1 :(得分:5)

静态变量属于类本身(不属于实例),并且子类或实现类不会继承这些变量。

因此:

public class InterfaceCheck implements Ainterface,Binterface {
    public static final int i=30;   
}

不会覆盖这两个接口的i它实际上是声明一个新的独立静态最终变量。

答案 2 :(得分:1)

Java具有单一继承,因为多继承具有在继承的类冲突成员名称时要选择哪些成员的问题。但是Java提供了接口,因为它提供了多重继承(附加行为)的大部分功能而没有名称冲突的风险(但是以选择在方法签名冲突时提供的方法为代价)。

在接口中允许类变量是对此规则的放宽,但可能因为成员变量所在的位置(每个类一个)而被允许。由于anubhava和Sotirios说他们不是继承,而是宣布一个新成员,掩盖了遗传变量。

您的问题涉及词汇范围。由于您已声明三个“公共”变量是类成员,因此您需要解析范围。由于你有两个继承的接口,你真的是要定义/设置自己的类变量,还是修改一个或两个继承的接口类变量?

答案 3 :(得分:0)

我建议您尝试使用代码以完全了解发生了什么,这里的线程很旧,但是都想添加以下内容:

注释掉静态类“ i”,当您运行代码时,您会看到java告诉您“对i的引用是不明确的”,即,由于两个接口中都存在它不知道要调用哪个。现在取消注释类静态“ i”的注释,并通过引用两个接口再添加两个打印输出。由于它们是静态的,因此允许。

public static final int i=30;

public static void main(String[] args) {        
        System.out.println(i);
        System.out.println(Ainterface.i);
        System.out.println(Binterface.i);
    }

30 10 20

同样,如果删除InterfaceCheck类的静态“ i”常量并删除其实现的接口之一,例如Binterface。您可以从Ainterface引用常量,而无需显式引用它,因为它是唯一创建的静态“ i”。

public class InterfaceCheck implements Ainterface {    

    public static void main(String[] args) {        
        System.out.println(i); //This will out Ainterface.i value of 10
        //System.out.println(Ainterface.i);
        //System.out.println(Binterface.i);
    }