7

我有一个问题,为什么接口中的成员变量不能是非常量。静态的逻辑在我的脑海中是正确的,如果一个人需要访问接口的变量,那么它是必须的是静态的,因为我们不能创建接口的实例,但是为什么需要 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();      
           }
}

提前致谢 !!!

4

5 回答 5

13

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

于 2012-08-16T05:37:06.210 回答
4

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

于 2012-08-16T05:29:43.333 回答
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();
    }
}
于 2014-11-07T07:37:07.153 回答
0

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

于 2012-08-16T05:30:39.013 回答
0

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

于 2012-08-16T05:35:48.777 回答