我知道接口只能在其中实现静态和最终值..但是我有什么漏洞可以改变它的值 使用接口的变量??这个问题可能很荒谬,但是因为我的要求,我无能为力。这是一段代码示例..
public interface I {
int val = 1;
int changeValue();
}
Class A implements I{
int changeValue(){
val = 2 ;
return 0;
}
}
如何使用界面更改'val'的值? 我可以做类似的事情:
val = changeValue();
在界面中是否有相同的功能?
答案 0 :(得分:4)
你不能。接口变量默认为static
和final
。
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。