繁体   English   中英

接口中需要澄清

[英]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();

有什么等效的功能可以在接口中执行此功能?

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

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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM