2011-09-08 13 views
31

これは、シーズンJava開発者にとっては単純かもしれませんが、私はそれを理解するように思えます。私はここから投稿を読む。コードはクラスの新しいインスタンスを作成するときのJavaオーバーライドメソッド

View v = new View(this) { 
    @Override 
    protected void onDraw(Canvas canvas) { 
     System.out.println("large view on draw called"); 
     super.onDraw(canvas); 
    } 
}; 

です。これはAndroidに関する質問です。ここでは、ユーザーがビューのインスタンスを作成し、メソッドを1行でオーバーライドします。この種のコーディングの名前はありますか?

もう1つの疑問は、別のパッケージの保護されたメソッドをオーバーライドすることです。保護された平均パッケージは非公開ではありません。私はこれを試してもうまくいくことは分かっていますが、なぜそれが働いたのか分かりませんでした。では、なぜこのコードは機能していますか?

私はこれをgoogleにしようとしましたが、尋ねる前にSOで検索しましたが、答えを見つけられませんでした。

答えて

18

protectedは、(大まかに)「サブクラスで利用可能」を意味します。 (this tableを参照してください。)new View(this) { ... }はサブクラスを作成するため、サブクラス内のメソッドをオーバーライドすることは可能です。

この場合、別のパッケージに入っていても問題ありません。 (protected行と第2列のthis tableを参照してください。)メソッドがサブクラスにあるという事実は、保護されたメソッドに "アクセス"するのに十分です。


潜在的なフォローアップの質問:それは作るんどのような意味、場合、私はメソッドをとにかく呼び出すことはできませんか?

Javaのすべてのメソッドは、仮想です。つまり、ViewクラスがonDrawメソッドへの一見内部呼び出しを実行すると、この呼び出しはオーバーライドされたメソッドに送出されます。

+0

。しかし、私は匿名のクラスを知らなかった。ありがとう。 – blessenm

9

これはまさに一種のコーディングではありません。これはJavaの匿名クラスです。 Androidや一般的にイベントリスナーやそのようなものでは非常に一般的です。あなたはthis link(おそらくない最良のもの)を読み取ることができます詳細については

匿名内部クラスは、いくつかの状況に非常に有用です。 の場合、クラスのサブクラスを作成せずにオブジェクト のインスタンスを作成し、メソッドのオーバーロードなどの追加タスクを実行する必要がある場合を考えてみましょう。あなたの2番目の質問について

は、キーワードprotectedは、メソッドは、サブクラスのみが利用可能であることを意味し、メソッドをオーバーライドすることが可能です。

+0

私はjavaの匿名クラスを知らなかった。リンクと説明をありがとう。 +1投票。 – blessenm

3

これは匿名のクラスです。保護されたメソッドをオーバーライドしていることは間違いありません。これは完全に正常です。保護されたメソッドは可視であるため、ここで作成したサブクラスによってオーバーライドできます。

変数またはメソッドのスコープを指定しないと、デフォルトのスコープが保護されます。それは保護されたものとは異なります。

1

これは既に匿名クラスと呼ばれていますが、保護されたメソッドは子クラスと同じパッケージのクラスから保護されたメソッドが可視であるため、匿名クラスと呼ばれます。

1

そう多くansweresは、「保護」のためにあったので、私は、基本クラスのメソッドをオーバーライドするようにコンパイラに通知され、他の1 :)
@Overrideに行きますし、この署名のない基本クラスのメソッドが存在しない場合コンパイルエラーがスローされます。

これらは注釈と呼ばれます。 Javaの注釈トピックを検索することができます。カスタムアノテーションも作成できます。私はちょっと、デフォルトのアクセスおよび保護されたアクセス忘れ

よろしく、
SSuman185

関連する問題