为什么接口变量需要初始化?

4

我想创建一个接口,强制所有实现它的类定义一个静态的最终整数变量:

public interface FooInterface {
    static final int bar;
}

但是编译器会提示“变量'bar'可能未被初始化”。为什么我需要在接口中给它一个值?我希望每个实现都定义自己的值,所以对我来说,在那里放置一些永远不会使用的任意数字似乎是不合逻辑的。

6个回答

4
你不能使用接口来实现这个功能。接口中的所有变量都隐式地是 public final static
但是,你可以在接口中定义 int getBar();,然后所有实现该接口的类都需要返回一个值。
此时,你需要确保实现者遵守规定,但你无法防止实现返回不同的值,例如:
public class Foo implements Bar {
    public int getBar() {
        return (int) System.currentTimeMillis();
    }
}

@GiacomoAlzetta 当然你可以编写返回随机值的敌对代码,但这不能通过将方法设为静态来解决。 - Kayaman
@GiacomoAlzetta 一个静态方法,你期望实现类单独实现,从概念上讲是没有意义的。 - Michael
@GiacomoAlzetta 因为在其他语言中支持并不意味着它在概念上是合理的。 - Michael
@Michael这意味着Java具有比其他语言更少表现力的对象模型。 - Giacomo Alzetta
2
@MartinHeralecký 接口一直都是关于行为而非数据的。对我来说这完全不合逻辑。 - Kayaman
显示剩余2条评论

3

您的思路有些偏颇。

static final 不能在实现类中被重写。

您可能希望这样实现:

public interface FooInterface {
    int getBar();
}

2

您不能这样做。接口只能强制实现它的类去实现方法。

在接口中定义的静态变量属于接口本身。它不会强制实现该接口的类声明相同的变量。


0
在普通的类中,我们有选项可以像这样定义它,并在静态初始化块中初始化其值:
public class FooClass {
    static final int bar;

    static {
        bar = 5;
    }
}

如果是一个接口,静态初始化块不被允许。这就是为什么Java要求在声明时设置初始值。


0

接口中的每个变量都是静态和不可变的。final变量必须在第一行或构造函数中初始化。因为接口没有构造函数,所以必须在第一行初始化final变量。


0

因为它们是 final 的,final 变量需要被初始化。


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