提问者:小点点

接口的静态字段和最终字段的含义


在接口vs抽象类这个问题和公认答案的刺激下,我想有一个更详细、更明确的答案。特别是我无法理解“接口中的字段是隐式静态和最终的”这句话。这是否意味着实现包含方法foo()的接口的类A可以将方法调用为A.foo()

关于最终的:只要接口只包含方法,给定一个抽象类A,它实现了一个带有方法foo()的接口,以及一个扩展了抽象类A的普通类B类B不能覆盖foo方法吗?就我而言,最终方法是不可能被覆盖的。最终什么是真的?


共3个答案

匿名用户

“接口中的字段是隐式静态和最终的”。

在接口编写中

int N = 1;
public int N = 1;
static int N = 1;
public static int N = 1;
// also
final int N = 1;
public final int N = 1;
static final int N = 1;
public static final int N = 1;

都是一样的。

这是否意味着实现包含方法foo()的接口的类A可以将该方法调用为A.foo()

字段和方法都是成员,但方法和字段不是一回事。

接口中的方法不能是静态最终,而是隐式公开和抽象的

int foo();
public int foo();
abstract int foo();
public abstract int foo();

对于接口都是一样的。

就我而言,最终方法是不可能被覆盖的

不能覆盖最终实例方法,也不能隐藏final static方法。

类似的嵌套接口,类和注解是公共和静态的。嵌套接口和注解也是隐式抽象的。

interface A {
    public static class C { }
    public static /* final */ enum E {; }
    public static abstract interface I { }
    public static abstract @interface A { }
}

匿名用户

“接口中的字段是……”

它在谈论字段。字段不是一种方法。

匿名用户

这是否意味着实现包含方法foo()的接口的类A可以将该方法调用为A.foo()?

不,您需要使用new创建A的实例,然后在实例上实现foo

 As long as interfaces contain only methods, given an abstract class A which implements an interface with a method foo() and an ordinary class B which extends the abstract class A, cannot the class B override the foo method? As far as I am concerned, final methods are impossible to be overridden. What is true finally?

接口方法不能是最终的,所以这个问题没有意义。实现接口的抽象类的子类可以为接口方法提供自己的实现。