Java 言語では、最終フィールドは初期化時に即時値を取り、変更できなくなります。Java バイトコード (jasmin) では、final フィールドを作成すると、初期化時に割り当てた即時値が無視され、後で他の変数と同じように変更できます。
元。Java コード:
public class App{
final int CONST = 2;
App(){
CONST = 3;
}
public static void main(String[] args){
App app = new App();
}
}
出力:
App.java:4 error: cannot assign a value to final variable CONST
元。ジャスミンバイトコード:
.class App
.super java/lang/Object
.field private final CONST I = 2 ;!!! the immediate value is ignored, 0 assigned
.method public <init>()V
.limit stack 3
.limit locals 1
aload_0
invokespecial java/lang/Object/<init>()V
aload_0
bipush 3
putfield App/CONST I ;!!! overwritting final field
return
.end method
.method public static main([Ljava/lang/String;)V
.limit stack 1
.limit locals 1
new App
invokespecial App/<init>()V
return
.end method
出力:
Generated: App.class
エラーはありませんか?新しい CONST 値の出力もテストしましたが、通常の変数と同じように機能します。Java コードのように final フィールドが機能しないのはなぜですか?