Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/391.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 在两个接口中声明并在一个类中实现的同一个最终变量_Java - Fatal编程技术网

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

Java 在两个接口中声明并在一个类中实现的同一个最终变量,java,Java,Hi I有两个接口,a接口和b接口具有与“I”相同的静态最终变量,分别声明为10和20,我正在实现这两个接口我的两个类InterfaceCheck,其中我声明了与static和final相同的接口变量,并初始化为30。当我在课堂上尝试打印I的值时,我得到30作为输出。有人能解释一下为什么我能够将I重新初始化为其他值,即使它是最终变量 代码 public interface Ainterface { public final static int i=10; } public int

Hi I有两个接口,a接口b接口具有与“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个类字段始终在引用的静态类型上解析

它暗地里是这样的

System.out.println(InterfaceCheck.i);
这就是你看到的


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

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

因此:

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

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

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

允许在接口中使用类变量是对该规则的放宽,但可能是因为成员变量位于何处(每个类一个)而被允许的。正如anubhava和Sotirios所说,他们不是继承的,而是声明了一个新成员,掩盖了继承的变量


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

我建议您仔细研究代码,以完全理解它正在发生什么,这里的线程非常旧,但仍然希望添加以下内容:

注释掉静态类“i”,当您运行代码时,您将看到java告诉您“对i的引用是不明确的”,即,它不知道您要调用哪个类,因为它存在于两个接口中。现在取消对类static“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);
    }
三十 10 二十

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


因为它不在同一个班级@JoahanthHunson我不认为静态的最终变量是“状态”。我的另一个疑问是最终的变量,我如何在初始化的类中重新初始化同一个变量?你想要一个由该类的所有对象共享的单个变量,还是每个类的一个变量?你想要一个常量还是一个变量?这是你想要分享但允许改变的东西吗?也许你想要的是一个私有(而不是公共)变量,然后是一个设置值的方法?如果它声明了一个新的自变量,那么在我的界面中将i作为final有什么意义?正如我写的那样,这些变量都是独立的,但是你可以使用其他变量作为
Ainterface.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);
    }
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);
    }