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クラス変数です。これは、クラス(またはこの場合はインターフェイス)のすべてのインスタンスに対して、その値が1つしかないことを意味します。

したがって、-の値は1つだけで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 に答える