0

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

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

}

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

如何使用接口更改“val”的值?我可以做类似的事情:

val = changeValue();

是否有任何等效于在界面中执行此功能的功能?

4

2 回答 2

4

你不能。接口变量是staticfinal默认情况下。

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

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

因此 - 你只有一个值I.x- 并且这个值不能改变。


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

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

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

于 2012-10-19T23:04:45.257 回答
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;

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

于 2012-10-19T23:22:46.173 回答