「Javaプログラミングのアイデア」多型インターフェイス

変換まで
  に定義される:その参照基底クラスとみなす慣行のオブジェクトへの参照は、変換呼び出される
バインドするメソッド呼び出し
  メソッド本体が結合呼ばれる関連付けられたメソッド呼び出しを。
  早期バインディング:プログラムの実行は、デフォルトが結合され、早期バインディング早期バインディングと呼ばれる前に行わバインディング、Javaの
  後半(動的結合または実行時バインディング)のバインディングは:実行時にオブジェクトの型に縛られますセット。静的メソッドと、最終的な方法に加えて、他のすべての方法は遅く、通常の状況下で、我々はそれが遅延バインディングを実行すべきかどうかを判断する必要はありませんされ、Javaで結合され、それが自動的に行われます。
コンストラクタとポリモーフィズム

  コンストラクタの呼び出しシーケンス:

  (1)最低まで、派生クラスのクラスを派生し、次の層に続いて、このステップは、この階層のルート構造から始まる、常に繰り返さ再帰なり、基底クラスのコンストラクタを呼び出します

  (2)初期化方法は、宣言順のメンバーと呼ばれています。

  (3)コール本体派生クラスのコンストラクタ    

  親クラス(静的変数、静的初期化ブロック)>サブクラス(静的変数、静的初期化ブロック)>
  親クラス(変数がブロックを初期化)>親クラスコンストラクタ>サブクラス(変数がブロックを初期化)>サブクラスコンストラクタ。(変数の定義と初期化のブロックの順序を初期化)    
多型法コンストラクタの内部に作用します

  コンストラクタ呼び出しの階層は、コンストラクタ呼び出しの内部動的にバインドメソッドは、オブジェクトが構築されている場合、何が起こるか、興味深いジレンマをもたらしますか?オブジェクトは、メソッド、またははそのクラスのクラスを派生したクラスに属している知ることができないので、ランタイムコールでの結合の一般的なアプローチは、動的に決定される内ではよく知られています。コンストラクタ呼び出しの内部動的にバインドする方法の場合は、上書きされた後、そのメソッドの定義を使用する必要があります。この呼び出しの結果は、メソッドは、オブジェクトが完全に構築される前に呼び出されます覆っているため、それが困難ないくつかのエラーを発見する可能性があり、予測することは非常に困難でした。

  

1つの パブリック クラステスト{
 2  
3      公共 静的 ボイドメイン(文字列[]引数){
 4           RoundGlyph(5 )。
5      }
 6  }
 7  クラスグリフ{
 8      ボイドドロー(){System.out.printlnは( "Glyph.draw()" )。}
 9      グリフ(){
 10          のSystem.out.println( "延伸前グリフ()" )。
11          ドロー();
12          のSystem.out.println( "グリフの後ドロー()" );
13      }
 14  }
 15  クラス  RoundGlyphは延びグリフ{
 16      プライベート int型の半径= 1 17      RoundGlyph(INT R){
 18          半径= R。
19          のSystem.out.println( "RoundGlyph.RoundGlyph()、半径=" + 半径)。
20      }
 21      空隙ドロー(){System.out.printlnは( "RoundGlyph.draw()、半径=" + 半径)。}
 22 }

  結果を実行するコード:

  

   結果は同じ、ちょっと、心配しないで、私たちはこのようなコードになるためにどのように分析する必要がありますが、期待された結果ではなくではありません。RoundGlyphクラスの最初の新しいmainメソッドでは、クラスローダは、それはそれはグリフクラスとコールドロー()コンストラクタでメソッドを実行グリフクラスのコンストラクタをロードして行くだろう、グリフクラスを継承することがわかったが、このメソッドは、派生クラスで覆われているので、この時間は、サブクラスのdraw()メソッド、有料の注意を呼び出します!この時にコードを実行するための鍵は、ただ単に、初期値が割り当てられているデフォルトのJavaサブクラスをロードし、半径のサブクラス半径可変電流値に初期化されていないとき、親実行draw()メソッドときその値は初期値のみなので、この時間意志出力0です。

  我々は驚くべき結論に達して:私たちは、特定のメソッド内の基底クラスのコンストラクタを呼び出し、メソッドはクラスでカバーエクスポートすると、この方法は、派生クラスのメソッドの代わりに、基本クラス自体で呼び出します。

  前の初期化シーケンスのために我々はそれを修正する必要があります。

  何かが起こる前に、(1)、オブジェクトに割り当てられたストレージ容量は、バイナリゼロに初期化されます

  (2)基底クラスのコンストラクタを呼び出します

  (3)初期化方法は、宣言の順序のメンバーと呼ばれています

  派生クラスのコールにおけるコンストラクタ本体(4)

  最後に:コンストラクタを書くことは、有効な基準を持っています。オブジェクトで可能な最も簡単な方法は避けるが、他のメソッドを呼び出す、可能な場合は、通常の状態になります。

抽象クラスと抽象メソッド

  抽象クラス:基本的なフォームを確立するための共通のインターフェース、エクスポートされたすべてのクラスの共通部分の表現として、

  抽象メソッド:メソッドは、メソッド本体文だけではありません。

  クラスは、1つまたは複数の抽象メソッドは、クラスが定義されている必須抽象含まれている場合は、抽象クラスと呼ばれる抽象クラスを含む方法。

  インターフェイス:インターフェイスのキーワードは前方抽象的な概念より多くのステップを行い、抽象的なキーワードは、人々は、1つまたは複数のクラスに定義された任意の方法を持っていないを作成することができますが、このクラスのある任意の対応する具体的な実装を提供していませんでした後継者が作成しました。interfaceキーワードは、インターフェイスが唯一のフォームを提供し、それは任意の特定の実装を提供していない、完全に抽象クラスを生成し、任意の特定の実装を提供していません。

  

おすすめ

転載: www.cnblogs.com/zhangchu/p/12638434.html