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

7

我知道这不被推荐,但为什么我不能声明一个接口的成员变量为静态的?

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

接口:

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。


不确定你的意思。接口中的所有变量隐式地为静态变量。 - Thilo
接口只能有静态成员变量。方法签名通常是非静态的,因为它们需要被实现(从Java 8开始有静态默认实现,但那些更像是特殊情况)。 - Thomas
3个回答

11
为什么我声明接口的成员变量不能是静态的?
它是隐式的静态的(意味着即使省略static关键字,它也是静态的,如JLS中所述):
每个接口中的字段声明都隐式地是public、static和final。可以冗余地指定这些修饰符中的任何一个或所有。
成员变量被定义为final的原因是,如果不这样做,任何实现都可以更改成员的值。然后,该成员将成为实现的一部分,但是如您所知,接口是纯抽象的。
成员变量被定义为静态的原因是,该成员属于接口,而不是实现实例。
此外,由于其为static,您应该只使用类名引用它(否则会收到编译器警告),而不是通过某些引用,因此int b = t.a;应该简写为int b = Test.a;

1
好的。我被这个事实误导了,即您也可以使用实例访问静态变量,就像在我的帖子中一样。我不知道这是可能的。 - sthor69

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

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

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