接口的成员变量必须是最终的......为什么?

时间:2012-08-16 05:26:25

标签: java interface static final

我心中有一个问题,为什么不能成为接口中的成员变量是一个非常数..静态的逻辑在我的脑海中是正确的,如果需要访问接口的变量那么它必须是静态的,因为我们不能创建接口的实例,但为什么需要最终产生?下面的代码显示了接口成员变量如何成为静态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();      
           }
}

提前致谢!!!

5 个答案:

答案 0 :(得分:12)

接口不是一个类,它是一组规则,并且无法实例化,那么它就不能包含任何volatile数据容器。只能在接口内设置常量,尽管不鼓励,因为在接口violates encapsulation approach中声明常量。

答案 1 :(得分:4)

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

答案 2 :(得分:0)

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

答案 3 :(得分:0)

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

答案 4 :(得分:0)

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