[英]Clarification needed in Interface
我知道接口只能在其中实现静态值和最终值。但是是否有任何漏洞可以通过使用接口更改变量的值? 这个问题可能很荒谬,但自从我提出要求以来,我感到无助。 这是示例代码。
public interface I {
int val = 1;
int changeValue();
}
Class A implements I{
int changeValue(){
val = 2 ;
return 0;
}
}
如何使用界面更改'val'的值? 我可以做类似的事情吗?
val = changeValue();
有什么等效的功能可以在接口中执行此功能?
你不能 。 接口变量默认为static
和final
变量。
final
变量是在对象生存期内无法更改的变量。
static
变量是一个类变量 -表示该类的所有实例(在这种情况下为接口)只有一个值。
因此-您只有一个Ix
值-并且该值不能更改。
您可能想做的是在界面中定义方法:
int getVal();
void setVal(int val);
并让实现类实现方法-这样您就可以将变量与getVal()
和setVal()
方法一起使用。
您不能为接口执行此操作。 但是,可以在类中修改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;
因为编译器对此有不同的处理(作为常量),请参见此答案 。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.