界面需要澄清

时间:2012-10-19 23:01:30

标签: java interface

我知道接口只能在其中实现静态和最终值..但是我有什么漏洞可以改变它的值 使用接口的变量??这个问题可能很荒谬,但是因为我的要求,我无能为力。这是一段代码示例..

public interface I {
    int val = 1;  
    int changeValue();

}

Class A implements I{
    int changeValue(){
        val = 2 ; 
        return 0;
    }
}

如何使用界面更改'val'的值? 我可以做类似的事情:

val = changeValue();

在界面中是否有相同的功能?

2 个答案:

答案 0 :(得分:4)

你不能。接口变量默认为staticfinal

final变量是在对象生命周期内无法更改的变量。

static vairable是一个类变量 - 这意味着该类的所有实例(或本例中的接口)只有一个值。

因此 - I.x只有一个值 - 此值无法更改。


您可能想要做的是在界面中定义方法:

int getVal();
void setVal(int val);

并使实现类实现方法 - 这样您就可以将变量与getVal()setVal()方法一起使用。

答案 1 :(得分:0)

您不能为界面执行此操作。但是,可以修改类中的static final变量:

public abstract class I {
    static final int val; 
    static
    {
        val = 1;
    }
}

import java.lang.reflect.*;

public class NotFinal
{
    public static void main(String args[]) throws Exception
    {
        System.out.println(I.val); // Before: 1     

        Field field = I.class.getDeclaredField("val");
        field.setAccessible(true);
        Field modifiersField = Field.class.getDeclaredField("modifiers");
        modifiersField.setAccessible(true);
        modifiersField.setInt(field, field.getModifiers() & ~Modifier.FINAL);
        field.set(null, 2);

        System.out.println(I.val); // After: 2
    }
}

输出:

1
2

请注意,如果您在声明中指定值,即

,则不起作用
static final int val = 1;

因为编译器对此的处理方式不同(作为常量) - 请参阅this answer