您好我有两个接口 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
答案 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);
}