また、Javaが匿名の内部クラスを作成する方法を理解するのにも役立ちます。 Javaがその特定のクラスをどのように実装するか。
Javaはコンパイラがコンパイル時にそのオブジェクトの型を知っていなければならないため、その変数をfinalにする必要があります。コンパイラは、匿名内部クラスの実装(この場合は 'et')内にフィールドを生成します。
タイプがfinalでない場合、コンパイラーはどのように内部クラスの実装を構築するかを決定します。基本的に、フィールドfinalを宣言することにより、Javaコンパイラに詳細情報を提供します。コンパイラを助けない
コード、あなたの匿名の内部クラスをコンパイルしません。
Object et;
et = a ? new Object() : new EditText();
...
を上記のコードでは、Javaコンパイラは、実際に構築することはできません匿名の内部クラス。
あなたコード:
最終のEditTextら=(のEditText)findViewById(R.id.t)。
...
new Button.OnClickListener$1(){
public void onClick(View v)<br>
{
Intent on=new Intent(Intent.ACTION_CALL,Uri.parse("tel:"+et.getText()));
startActivity(on);
}
});
... Javaコンパイラは、あなたがそれは次のようになります。但し、内部クラスブロックの実装をバイトコードクラスを作成します。
public class OnClickListener$1 {
private final EditText et ; <---- this is important
public OnClickListener$1(final et) {
this.et = et;
}
public void onClick(View v)<br>
{
Intent on=new Intent(Intent.ACTION_CALL,Uri.parse("tel:"+et.getText()));
startActivity(on);
}
}
あなたは私が匿名のバイトコードクラスに$ 1見つけることによって、そのバイトコードファイル逆コンパイル提供擬似コードをテストすることができます。
ドロイド変数をしている:あなたは、あなたのLogcatに持っていた誰がどのようなエラーが、私たちに伝えることができますか? –
その実行時間ではなく、コンパイル時にエラーが発生しました。 "別のメソッドで定義された内部クラスの中で、最終的な変数ではないことを参照できませんでした"これは私が得たものです... –