Java-接口的非静态成员变量

Java-接口的非静态成员变量,java,interface,static,member,Java,Interface,Static,Member,我知道不建议这样做,但为什么我可以声明接口的成员变量不是静态的 接口的静态成员和非静态成员之间有什么区别?我发现,如果我将接口成员变量定义为静态变量,我可以在实现类中以非静态的方式使用它: 接口: public interface Pinuz { final static int a; public void method1(); } 实现类: public class Test implements Pinuz { public static void main(S

我知道不建议这样做,但为什么我可以声明接口的成员变量不是静态的

接口的静态成员和非静态成员之间有什么区别?我发现,如果我将接口成员变量定义为静态变量,我可以在实现类中以非静态的方式使用它:

接口:

public interface Pinuz {
    final static int a;

    public void method1();
}
实现类:

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

        Test t = new Test();
        int b = t.a;
    }

    @Override
    public void method1() {
        // TODO Auto-generated method stub

    }
}
我只看到一条警告,要求我以静态方式使用成员a

为什么我可以声明接口的成员变量不是静态的

它是隐式的
静态的
(和
最终的
)(这意味着它是
静态的
,即使您省略了
静态的
关键字):

接口主体中的每个字段声明都是隐式的
公共的
静态的
,以及
最终的
。允许为此类字段冗余指定任何或所有这些修饰符

之所以是final,是因为任何实现都可能更改member的值,如果它没有定义为
final
。然后成员将成为实现的一部分,但正如您所知,
接口
是一个纯粹的抽象

之所以是静态的,是因为成员属于接口,而不是实现实例


另外,作为
静态的
,您应该只使用类名引用它(否则会得到编译器警告),而不是通过一些引用,因此
intb=t.a应该写成
intb=Test.a

您不能在Java接口中声明非静态变量。
接口中的每个变量都是隐式公共的、静态的和最终的。

接口的所有成员变量,无论您是否声明为静态的,都是静态的。

不确定您的意思。接口中的所有变量都是隐式静态的。接口只能有静态成员变量。方法签名通常是非静态的,因为它们需要实现(从Java8开始,有静态的默认实现,但这些只是一个特例)。我被一个事实误导了,即您也可以使用实例访问静态变量,正如我在文章中所说的那样。我不知道这是可能的。