可以重新初始化接口变量吗?

Can an Interface variable be reinitialised?

interface abs{
 int a=10;// by default final static
     void callme(); 
}
class B implements abs{
    int a =11;// reinitializing

    void call()
    {
            System.out.println("No problem"+a);
    }
    public void callme()
    {
            System.out.println("Call me"+a);
    }

}
class main{


    public static void main(String args[]){

        B m=new B();
        m.call();
        m.callme();
    }

}

在 Herbert Schildt 的书中,我读到接口变量默认为 Final 和 static。这隐含地意味着它将像常量一样起作用。但是当我在上面提到的代码中为变量 a 分配 11 时,它没有给出任何错误。

o/p 没问题11 叫我11

您没有重新初始化变量,而是隐藏了它。

为了访问 absa 成员,您必须使用接口名称引用它。类似于:

System.out.println("No problem" + abs.a);

在 class B 中初始化 a 时,您并未修改 abs.a 的值。字段 B.a 只是从界面中隐藏了继承的 a。您仍然可以使用完全限定名称 abs.a.

从 class B 中的代码访问 abs.a

因为你又声明了变量

int a =11;

所以看到你想要的错误

在您的 class

中执行此操作
a=11;

在你的例子中,a 是一个属于 class B

的全新变量

不,你不能重新初始化接口变量。你实现中的变量Class不是接口变量A , 但 B class' 实例变量。如果要访问接口变量,请将其引用为 abs.A

你实际上在做的是通过在 class B 中声明一个同名变量来隐藏接口中的变量。你可以使用以下代码验证它:

public interface Abs {
            int a=10;// by default final static
            void callme();
            default void printA() {
                System.out.println("A in interface: " + a);
            }
    }

public class B implements Abs {
    int a =11;// reinitializing

    void call()
    {
        System.out.println("A in class: "+a);
    }
    public void callme()
    {
        printA();
    }
}

那么我们有:

public static void main(String[] args){
        B m=new B();
        m.call();
        m.callme();
    }

它打印:

A in class: 11 A in interface: 10