Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/oop/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 为什么接口变量需要初始化?_Java_Oop_Interface - Fatal编程技术网

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

Java 为什么接口变量需要初始化?,java,oop,interface,Java,Oop,Interface,我想创建一个接口,强制所有实现它的类定义一个静态最终整数变量: public interface FooInterface { static final int bar; } 但是编译器说“变量‘bar’可能没有初始化”。为什么我必须在接口中给它一个值?我希望每个实现都定义自己的值,因此我认为必须在其中添加一些永远不会使用的任意数字是不合逻辑的。使用接口无法做到这一点。接口中的所有变量都隐式地public final static 您可以定义intgetbar()

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

public interface FooInterface {
    static final int bar;
}

但是编译器说“变量‘bar’可能没有初始化”。为什么我必须在接口中给它一个值?我希望每个实现都定义自己的值,因此我认为必须在其中添加一些永远不会使用的任意数字是不合逻辑的。

使用接口无法做到这一点。接口中的所有变量都隐式地
public final static

您可以定义
intgetbar()
这样,您就有责任确保实现者行为良好,但您不能阻止实现返回不同的值,例如

public class Foo implements Bar {
    public int getBar() {
        return (int) System.currentTimeMillis();
    }
}

你从错误的角度考虑这个问题

不能在实现类中重写
静态final

您可能希望这样做:

public interface FooInterface {
    int getBar();
}

你不能那样做。接口只能强制实现它的类实现方法


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

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

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

在普通类中,我们可以这样定义它,并在静态初始化程序块中初始化它的值:

public class FooClass {
    static final int bar;

    static {
        bar = 5;
    }
}

对于接口,不允许使用静态初始化块,这就是为什么Java要求在声明时将其设置为值。

@GiacomoAlzetta确保您可以编写返回随机值的恶意代码,但这不能通过使方法静态来解决。@GiacomoAlzetta一个静态方法,您希望实现类来单独实现,但它在概念上没有意义。@Michael是的,它是有意义的,只是Java不支持
抽象静态的概念,这在很多其他语言中都很容易得到支持。@GiacomoAlzetta因为在其他语言中得到支持并不意味着它在概念上是有意义的。@Martineralecký接口总是关于行为,而不是数据。对我来说,这根本不符合逻辑。