これが許可されない理由
main
方法です。他のプログラミング言語と同様に、メソッドが戻ると、その本体で宣言されたすべての変数がスコープ外になり、それらへのアクセスは未定義の動作をします。状況によっては、以前のメモリ位置が無効になります。
明らかにこれは問題です。num
が戻った後に変更しようとすると、もうmain
属していないスタックの一部を上書きする可能性がありますnum
。この困難な状況に対する Java の対応は、変数を共有する方法に制限を導入することです。それらは最終的なものでなければなりません。Java は、関数が返された後でもそれらを読み取ると一貫した結果が生成されるように、それらを安全に見つけることができます。
この問題に相当する C は、ローカル変数のアドレスをそのスコープ外に保存して使用することです。これは、すべての C プログラマーが決して行うべきではないと教えられていることです。
num
これを回避するには、 のメンバーとして宣言しtest
、インスタンスを作成して、それを渡します。これにより、ローカル変数への依存がなくなり、final
制限がなくなります。
public class test
{
int num = 111;
public static void main(String[] args) throws Exception
{
test t = new test();
(new Thread(t) {
test mytest;
Thread(test t)
{
mytest = t;
}
@Override
public void run() {
mytest.num = 222;
}
}).start();
}
}