【问题标题】:Member Variables of an interface must be final... Why?接口的成员变量必须是最终的……为什么?
【发布时间】:2012-08-12 10:44:07
【问题描述】:

我有一个问题,为什么接口中的成员变量不能是非常量。静态的逻辑在我的脑海中是正确的,如果需要访问接口的变量,那么它就是必须让它是静态的,因为我们不能创建接口的实例但是为什么需要 final 出现?下面的代码展示了接口成员变量是如何变成静态最终的,即使我们默认没有提到它......

interface inter{

       int a=10; // It becomes final static by default

       public void interFunc();
} 

class cls implements inter{

       public void interFunc(){

           System.out.println("In Class Method WITH a's Value as --> "+a);
       }
}

class Test{

       public static void main(String[] args){

           inter in= new cls();

           in.interFunc();      
           }
}

提前致谢!!!

【问题讨论】:

标签: java interface static final


【解决方案1】:

Java- 不实现多重继承 但是通过接口我们可以实现。

interface i1{  
    int a=1;  
}  

interface i2{  
    int a=2;  
}  

class exampleInterface implements i1,i2{  
    public static void main(String...a){  

        //As interface members are static we can write like this
        //If its not static then we'll write sysout(a) ... which gives ambiguity error.
        //That's why it is static.

        System.out.println(i2.a); 
    }  
}  

现在因为它是静态的,所以它应该是最终的,因为如果它不是最终的,那么 任何实现它的类都会改变值和 其他实现接口的类将收到更改的值。 例如,如果类 x 将 r 作为静态而不是最终的。

class x{
    static int r=10;
}

class y extends x{
    static void fun(){
        x.r=20;
        System.out.println(x.r);
    }
}

class m extends x{
    void fun(){
        System.out.println(x.r);
    }
}

public class Test{
    public static void main(String[] args) {

        y.fun();
        m obj=new m();
        obj.fun();
    }
}

【讨论】:

    【解决方案2】:

    接口不是一个类,它是一组规则,不能被实例化,所以它里面不能包含任何易失的数据容器。只能在接口内部设置常量,尽管不鼓励这样做,因为在接口violates encapsulation approach 中声明常量。

    【讨论】:

    • 与问题无关,但我看不出在接口(共享知识)中声明的常量如何违反封装。除非提供接口也是违反封装的。但是,这一切都在链接中进行了解释:根据需要在接口中声明尽可能多的变量 - 只需使用 static import 而不是实现/扩展它。
    【解决方案3】:

    默认情况下,Java 成员变量必须是最终的,因为接口不应该被实例化。默认情况下,它们也是静态的。因此,您无法更改它们的值,也无法在分配它们后重新分配它们。 Here's 接口上的东西。希望对您有所帮助。

    【讨论】:

      【解决方案4】:

      接口变量是静态的,因为 Java 接口不能单独实例化;变量的值必须在不存在实例的静态上下文中分配。 final 修饰符确保分配给接口变量的值是一个真正的常量,程序代码不能重新分配。 请记住,界面用于显示您将要实现的“什么”而不是如何实现。所以变量应该是最终的(因为非静态变量与类的整个规范无关)。

      【讨论】:

      • 请附上报价来源的链接。此外,标记> stuff 可用于引用“stuff”。
      • 好的..谢谢朋友..这是一个很好的解释,在这里清除了一些网络...... :)
      【解决方案5】:

      对于成员变量,我认为它必须是静态的,因为无法为接口创建对象,因此要访问成员变量,需要将其设为静态并通过类访问它。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2011-01-26
        • 1970-01-01
        • 2014-01-02
        • 2021-12-20
        • 1970-01-01
        • 2018-02-10
        • 1970-01-01
        相关资源
        最近更新 更多