5

嗨,我有两个接口AinterfaceBinterface具有与“ i ”相同的静态最终变量,分别声明为1020,我在两个类InterfaceCheck中实现这两个接口,我将相同的接口变量声明为 static 和 final 并初始化为30 . 当我尝试在我的班级中打印i的值时,我得到 30 作为输出。有人可以解释一下为什么我能够将i重新初始化 为其他值,即使它是最终变量。

代码

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

}

>> 输出:30

4

4 回答 4

11

类字段总是在引用的静态类型上解析。

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

它隐含地

System.out.println(InterfaceCheck.i);

所以这就是你所看到的。

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

于 2013-10-04T18:12:48.870 回答
5

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

所以:

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

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

于 2013-10-04T18:15:37.870 回答
1

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

在接口中允许类变量是对这一规则的放宽,但可能是因为成员变量所在的位置(每个类一个)而被允许。正如 anubhava 和 Sotirios 所说,它们不是继承的,而是声明一个新成员,隐藏了继承的变量。

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

于 2013-10-04T18:27:26.430 回答
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);
    }
于 2020-12-02T09:16:11.210 回答