java接口字段编译不需要的修饰符

Posted

技术标签:

【中文标题】java接口字段编译不需要的修饰符【英文标题】:java interface fields compiled undesirable modifiers 【发布时间】:2013-07-17 18:13:46 【问题描述】:

我声明了如下接口:

public interface SQLSyncAble

    boolean modified = true;
    long id = -1;

    static HashMap<String,SQLAction> SQLModifiers = new HashMap<String,SQLAction>();
    static Field[] SQL_Object_Fields = null;
    static DataType[] TransferDataTypes = null;

在其他类中,我想设置一个实现此接口的对象,我得到编译错误:

someobject.id = 10  // The final field SQLSyncAble.id cannot be assigned.
                    //The static field SQLSyncAble.id should be accessed in a static way.

大声笑什么? “id”和“modified”不是“static final”,我让我看到编译后的 .class 文件(我在 Java 汇编编辑器和 Eclipse 中检查过),真的!每次(无论是eclipse还是java)在编译的类中,所有字段都将具有“static final”修饰符。但为什么呢?

如果我将此接口修改为“抽象类”,问题会立即消失。

...但这只是一半的解决方案,java只允许超类之一。

为什么在我的界面中添加了不受欢迎的修饰符?

【问题讨论】:

通过显示的代码,您可能希望拥有一个抽象类,而不是接口。 【参考方案1】:

根据定义,接口的所有字段都标记为static final

如果您需要非静态、非最终成员,则应该有一个围绕接口的类。

【讨论】:

看起来我必须使用抽象类,但是接口静态最终中的所有字段是什么原因?【参考方案2】:

在初始化后,您永远无法更改最终变量。

我们在接口中定义的所有字段都是隐式公共的、静态的和最终的。再次,您在界面中分配了一个值,您稍后尝试更改,所以您不能这样做。

【讨论】:

以上是关于java接口字段编译不需要的修饰符的主要内容,如果未能解决你的问题,请参考以下文章

Java 接口中的方法是不是应该使用或不使用公共访问修饰符来声明?

java 关键字

Java修饰符

Java接口

Java基础之接口

Java访问控制修饰符权限