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

8

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

Thanks in advance !!!


为什么接口变量默认是静态和不可修改的? - Amit Deshpande
5个回答

13

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


1
与问题无关,但我不明白在接口中声明常量(共享知识)如何违反封装。除非提供接口也是违反封装的行为。然而,这一切都在链接中有所解释:在接口中声明所需的变量数量 - 只需使用“静态导入”而不是实现/扩展它即可。 - uvsmtid

4

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


2

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

现在,由于它是静态的,所以应该是final的,因为如果它不是final的,则实现它的任何类都会更改该值,而实现接口的其他类将接收到更改后的值。例如,如果类x将r作为静态变量而不是final变量,请参见以下示例。
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();
    }
}

0

接口变量是静态的,因为Java接口本身不能实例化;变量的值必须在没有实例存在的静态上下文中分配。final修饰符确保分配给接口变量的值是真正的常量,不能被程序代码重新分配。

请记住,接口用于展示要实现的'内容'而不是如何实现。因此,变量应该是final的(因为非静态变量与类的整个规范无关)。


1
请在引用中包含源链接。此外,可以使用标记 > stuff 引用“stuff”。 - user166390
好的,谢谢朋友。这是一个很好的解释,清楚了一些困惑。:) - AnkitChhajed

0

Java成员变量默认情况下必须是final的,因为接口不应该被实例化。它们也默认为静态的。因此,一旦赋值后,您不能更改其值,也不能重新分配它们。这里有关于接口的一些内容。希望能对您有所帮助。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接