ポリモーフィックなJavaオブジェクト指向プログラミング機能

  ポリモーフィズムは、オブジェクト指向プログラミングの3つの主要な機能の1つであり、オブジェクト指向思考の究極の兆候の1つです。ポリモーフィズムを理解する前に、サブクラスオブジェクトを指す継承、書き換え、および親クラス参照の概念を習得する必要があります。継承を完全に理解していない学生は、Javaオブジェクト指向プログラミング継承の3つの主要な特性であるポータルに入ることができます。
  
  1.抽象クラス
  
  の継承では、子クラスと親クラスの関係、および子クラスと親クラスの設計方法を理解しました。複数のエンティティクラスが既に存在する場合、親クラスの定義は、実際には共通の一致する部分を継続的に抽出するプロセスです。必要に応じて、複数の継承関係が生成されます。抽出と並べ替えのプロセスでは、属性を再利用できるほか、グラフィックの例を前提として、再利用できる多くの方法があります。四角形、円、周長と面積の2つの方法があるが、計算方法は完全に異なります。四角形と円の関係は親子関係を構成してはなりません。したがって、同時に継承できるのは親クラスのみです。その場合、問題が発生します。これらの2つのクラスに共通するものは何ですか。
  
  技術的な写真
  
  にはグラフィック以外は何も共通していないようです。長方形には2組の辺があり、円は半径で表されます(相互に接続する必要がある場合)。ちょっと待ってください(オーラのフラッシュで、邪魔しないでください)!円周と面積は計算できますか?注意深く考えれば本当のことは言えますが、これは抽象的です!
  
  これが実際に当てはまる場合は、漠然とした考えしかありません。グラフィックを記述する属性は共有できないため、2つのサブクラスに配置する必要があります。境界と面積の計算方法は?対応するメソッドが親クラスで定義されている場合、パラメーターリストの記述方法を教えてください。メソッド本体を埋めるには?このピットは少し大きいようですが、これを惜しみなく埋めます。
  
  1.抽象化と抽象クラス
  
  上記の例では、論理的に関連しているように見える2つのクラスがあり、それらを接続したいという状況に遭遇しました。この共通点はやや曖昧すぎて、コードで記述するのが難しく、個別に使うとさらに便利です。このとき、抽象概念を導入する必要があります。対応するキーワードは抽象です。
  
  アブストラクトはメソッドを変更できます。変更後は、アブストラクトメソッドと呼ばれます。
  
  アブストラクトは、クラスを変更できます。変更後は、アブストラクトクラスと呼ばれます。
  
  アブストラクトは静的修飾子と一緒に使用できません
  
  。つまり、指定されたメソッドとクラスは表現するのが難しいということです。それを表現する必要はありません!四角形クラス(Rectangle)と円クラス(Circle)の親クラス:図クラス(図)の場合、彼は周囲と面積を計算する方法を持っていると結論付けることができるだけで、特定の実装方法は提供できず、明確にするだけです特定の実装はグラフィックの後にのみ指定できるため、これらの2つのメソッドを説明するために抽象を使用します。抽象によって変更されたメソッドは、メソッド本体を持つ必要がなく、プライベートにすることはできません。抽象メソッドにはメソッド本体がないため、コードによって呼び出された場合到着したらどうすればいいですか?次の2つの制限ルールにより、この問題を排除できます。
  
  抽象メソッドは抽象クラスにのみ存在できます(インターフェイスについては別の記事で説明します)
  
  抽象クラスを直接インスタンス化することはできません(匿名内部クラスの使用については、現時点では説明して
  
  いません)。インスタンス化されている場合、当然、メソッド本体のないメソッドは呼び出されないので、これらのメソッドをどのように呼び出す必要がありますか?ステップバイステップで説明する必要があります。少なくとも今のところ、次の関係図を明確に得ることができます:
  
  テクニカルピクチャ
  
  2.
  
  抽象クラスの特性抽象クラスの本質はクラス(クラス)なので、すべての共通クラスがあります構築メソッドの定義などを含む関数。要約すると、抽象クラスには次の特性があります。
  
  抽象クラスはabstractによって変更され
  
  ます。抽象メソッドは抽象クラスで許可されます。
  
  抽象クラスはコンストラクタを介して直接インスタンス化できません。
  
  共通クラスは抽象クラスで定義できます子クラスの継承
  
  についてこれで、抽象親クラスをコードで記述できます。
  
  //抽象クラスを定義:グラフィッククラス
  
  public abstract class図{
  
  //境界を計算するための抽象メソッドを定義:getC()
  
  public abstract double getC();
  
  //面積を計算するための抽象メソッドを定義:getS()
  
  public abstract double getS( );
  
  //グラフィックを説明するための非抽象メソッドを定義します:print()
  
  public void print(){
  
  System.out.println( "This is a graphic");
  
  }
  
  }
  
  3.自然な親クラス:抽象クラスが
  
  すでに存在しています抽象メソッドが定義されている抽象クラスが定義されています。抽象クラスを直接インスタンス化して、抽象メソッドが直接呼び出されないようにすることはできません。出発点を思い出して、2つのクラスのより抽象的な共通点を抽出するために抽象クラスを作成するために一生懸命に取り組み、その後、次のステップは自然に継承されます。
  
  抽象クラスを直接インスタンス化することはできません。これは自然な抽象クラスです。
  
  クラスが抽象クラスを継承する場合は、親クラスの抽象メソッドをオーバーライドする必要があります。
  
  抽象クラスがコンストラクタを定義している場合、サブクラスによって呼び出されるか、サブクラスオブジェクトでインスタンス化されます。実行時に
  
  子供がまだ抽象クラスは抽象クラスである場合には、抽象メソッドを書き換えることができない、書き換え動作は、サブクラスの下に残っている
  
  II書き換え可能
  
  書き換えとは、子クラスと親クラスの間のメソッドによって形成される関係を指します。子クラスが親クラスを継承するときに、一部のメソッドが親クラスにすでに存在する場合があるため、子クラスインスタンスを直接呼び出すことができます。場合によっては、親クラスと子クラスの違いにより、既存のメソッドにいくつかの変更を加える必要があります。現時点では、rewriteを使用して、returnを含め、親クラスのメソッドとまったく同じメソッドをサブクラスに定義できます。値タイプとメソッドシグネチャ(メソッド名+パラメータリスト)は、この時点で書き換えを構成します。このように、サブクラスインスタンスは、メソッドを呼び出すときに親クラスのメソッドをオーバーライドできます。具体的なプロセスについては、後半で説明します。
  
  1.書き換えとオーバーロードの違い
  
  初めてメソッドに触れたときに、概念を学びました:書き換えと多少似ているオーバーロードは混乱しやすいです。ナレッジポイントが既に曖昧な場合は、Javaプログラムのメソッド設計というポータルに入ることができます。要約すると、書き換えとオーバーロードには次の違いがあります。
  
  オーバーロードは同じクラス内のメソッドとメソッド間の関係
  
  です。書き換えは親クラスと子クラスの間のメソッドとメソッド間の関係です(インターフェイスと実装クラスの間)
  
  オーバーロードを構成します。:同じメソッド名、異なるパラメータのリストは、戻り値の型は異なっていてもよい
  
  構成オーバーライド:同じ方法、同じパラメータリストの名前は、対応するタイプまたはサブクラスの型と同じ値を返し
  
  構成メソッドオーバーロードの間に異なっていてもよい許可剤を
  
  重量writeメソッドの権限修飾子は、rewriteメソッドの権限修飾子よりも大きくなければなりません。
  
  権限修飾子の役割が明確でない場合は、ポータルに入ることができます。Javaオブジェクト指向プログラミング-カプセル化の3つの特性です。書き換えの意味を明確にした後、最後にペンを再び上げて、前の例を完了できます  。//
  
  長方形のクラスを定義します
  
public class Rectangle extends Figure {
  
  //コンストラクターを定義します
  
  public Rectangle(double height、double width){
  
  this.height = height;
  
  this.width = width;
  
  }
  
  //長さと幅を定義する
  
  public double height;
  
  public double width;
  
  //円周を計算するメソッドを書き換える
  
  @Override
  
  public double getC(){
  
  return 2 *(this.height + this.width);
  
  }
  
  //計算領域メソッドを書き換えます
  
  @Override
  
  public double getS(){
  
  return this.height + this.width;
  
  }
  
  //オプションのオーバーライド
  
  @Override
  
  public void print(){
  
  System.out.println ( "Rectangle");
  
  }
  
  }
  
  //サークルクラスを定義します
  
  public class Circle extends Figure {
  
  //コンストラクターを定義します
  
  public Circle(double radius){
  
  this.radius = radius;
  
  }
  
  //半径を定義します
  
  public double radius;
  
  //計算周長メソッドをオーバーライドします
  
  @Override
  
  public double getC(){
  
  return 2 * Math.PI * this.radius;
  
  }
  
  //計算領域メソッドをオーバーライドします
  
  @Override
  
  public double getS(){
  
  return Math。 PI * Math.pow(this.radius、2);
  
  }
  
  //オプションのオーバーライド
  
  @Override
  
  public void print(){
  
  System.out.println( "circle");
  
  }
  
  }
  
  2.メソッド
  
  書き換えのルール書き換え@Override
  
  メソッド書き換えは、サブクラスまたはインターフェースの実装クラスで行われます。final
  
  によって宣言されたメソッドは書き換えできません。static
  
  によって宣言されたメソッドは書き換えできません。同じ構造の静的メソッドのみを宣言できますが、現時点では書き換えを構成しません。
  
  許可修飾子によって制限されます。サブクラスは、
  
  親クラスのメソッドの一部のみを書き換えることができる場合があります。3.親クラスメソッドの明示的な呼び出し
  
  上記のコードからわかるように、サブクラスが親クラスを継承した後、書き換えなどの抽象メソッドがある場合、親クラスのメソッドは抽象であるため、呼び出すことができません。通常のメソッドでは、選択的に書き換えることができます。親クラスのメソッドを書き換えると、親クラスのメソッドが上書きされたと考えることができます。実際、この記述は不正確であり、初期段階で上書きされていると考えられます。
  
  より標準化された引数は、親クラスの同じ名前のメソッドはサブクラスインスタンスを介して直接呼び出すことはできませんが、メモリには親クラスメソッドの構造が残っていますが、アクセスできません。さらに、superキーワードを必要とするサブクラスの親クラスメソッドを明示的に呼び出すこともできます。
  
  superは親クラスオブジェクトを参照します
  
  superはアクセス可能な親クラスメンバー変数
  
  を呼び出すことができますsuperはアクセス可能な親クラスメンバーメソッドを呼び出すことができますsuperはアクセス可能な親クラスメンバー
  
  を呼び出す
  
  ことができますsuperを使用して親クラスの抽象メソッドを呼び出すことはできません
  
  super呼び出しを使用できます親クラスの静的メソッド子クラスで
  
  親クラスのメソッドまたはコンストラクターを呼び出す必要がある場合は、次のようにコードを変更できます
  
  。//抽象クラスを定義します:グラフィッククラス
  
  public abstract class Figure {
  
  //抽象クラスでコンストラクターを定義します。実行
  
  public Figure(){
  
  System.out.println( "Figure init");
  
  }
  
  // サブクラスインスタンスの作成時に境界を計算する抽象メソッドを定義します:getC()
  
  public abstract double getC();
  
  //計算された領域を定義します抽象メソッド:getS()
  
  public abstract double getS();
  
  //グラフィックを説明する非抽象メソッドを定義します:print()
  
  public void print(){
  
  System.out.println( "This is a graphic");
  
  }
  
  }
  
  //長方形のクラスを定義します
  
  public class Rectangle extends Figure {
  
  //構造を定義しますデバイス
  
  公共矩形(ダブル高さ、ダブル幅){
  
  スーパー();引数なしのデフォルト・コンストラクタを呼び出す、コードが省略されてもよい//
  
  this.height =高;
  
  this.width =幅;
  
  }
  
  //幅と高さの
  
  公共二重高さ;
  
  public double width;
  
  //計算境界メソッドをオーバーライド
  
  @Override
  
  public double getC(){
  
  return 2 *(this.height + this.width);
  
  }
  
  //計算領域メソッドをオーバーライド
  
  @Override
  
  public double getS(){
  
  this.height + this.width;
  
  }
  
  //オプションのオーバーライドを返す
  
  @Override
  
  public void print(){
  
  super.print(); //親クラスのメソッドを呼び出す
  
  System.out.println( "rectangle");
  
  }
  
  }
  
  //サークルクラスを定義する
  
  public class Circle extends Figure {
  
  //コンストラクタを定義する
  
  public Circle(double radius){
  
  super(); //デフォルトのパラメータなしの構成を呼び出すため、コードを省略できます
  
  this.radius = radius;
  
  }
  
  //半径を定義し
  
  ますpublic double radius;
  
  //計算境界メソッドを書き換えます
  
  @Override
  
  public double getC(){
  
  return 2 * Math.PI * this.radius;
  
  }
  
  //計算領域メソッドを書き換えます
  
  @Override
  
  public double getS(){
  
  return Math.PI * Math.pow(this.radius、2);
  
  }
  
  / /オプションのオーバーライド
  
  @Override
  
  public void print(){
  
  super.print(); //親クラスのメソッド
  
  System.out.println( "circle");
  
  }
  
  }を呼び出す
  
  3、親クラスの参照は子クラスオブジェクトを指す
  
  上記の概念が消化されたら、子の親クラスを見てみましょうオブジェクトのインスタンス化の形式とメソッドの実行効果。
  
  1.親クラス参照は、親クラスオブジェクトをポイントします。
  
  親クラスが抽象クラスの場合、等号の右側で新しいプラスコンストラクターメソッドを使用してインスタンス化することはできません。親クラスインスタンスを取得する必要がある場合は、匿名の内部クラスを使用する必要があります。ここでは説明しませんが、使用法。
  
  親クラスが通常のクラスの場合、初期化すると、等号の左側が親の型参照となり、等号の右側が親の型オブジェクト(インスタンス)になります。現時点では、クラスオブジェクトの作成との違いはありません。 、彼は特定のクラスの親であると考える必要はありません。現時点では、サブクラスとの関係はなく、デフォルトでObjectクラスを継承する通常のクラスだけであり、通常はそれを使用するだけなので、コンテンツを呼び出すことができます。親クラスで定義されています。
  
  2.サブクラス参照がサブクラスオブジェクトを指す
  
  サブクラスがインスタンス化されると、親クラスはサブクラスの定義に継承されるため、サブクラスオブジェクトを作成するときに、親クラスオブジェクトが最初に作成されます。呼び出しを行うとき、許可修飾子に従って、サブクラスと親クラスでアクセスできる属性とメソッドを呼び出すことができます。
  
  public class Test {
  
  public static void main(String [] args){
  
  Rectanglerectangle = new Rectangle(5,10);
  
  // Rectangleで定義されているメソッドを呼び出し
  
  ます。
  
  System.out.println(rectangle.getC()); //長方形の周囲を取得
  
  System.out.println(rectangle.getS()); //長方形の領域を取得
  
  Circle circle = new Circle(5);
  
  //円を呼び出すで定義されているメソッドは、サブクラスの書き換えの
  
  影響を受けますcircle.print();
  
  System.out.println(circle.getC()); //円形の境界を取得
  
  System.out.println(circle.getS()) ; //循環領域を取得します
  
  }
  
  }
  
  3.参照とオブジェクトの関係
  
  プログラミングの学習を始めたとき、キーワードで直接宣言でき、変数の割り当てを定義した後に使用できる基本的なデータ型にさらされました。キーワード。参照とオブジェクトの関係については、以前の記事を参照してJavaクラスとオブジェクトの基本操作単位を確認してください。ここで説明したいのは、等号の左側の参照部分と、プログラム実行レベルでの等号の右側の部分との関係です。
  
  基本的なデータ型とは異なり、クラスではさまざまなプロパティとメソッドを定義でき、オブジェクトは使用前に作成する必要があります。等号の左側の部分は依然として型宣言です。割り当てられていない場合、デフォルトではnullですが、プログラムがコンパイルおよび実行されると、スタックにも格納され、対応する構造情報が記録されます。ポイントするオブジェクトはそれと互換性のあるタイプです。
  
  クラス宣言参照はスタックに格納され、インスタンス化されたオブジェクトはヒープに格納されます。
  
  コードの記述段階では、等号の左側の型に基づいて呼び出せる内容が
  
  、プログラム実行段階では、等号の右側のインスタンスに基づいて実行効果が決まります。
  
  次の図は、メモリ内の参照とインスタンスの関係の概略図です。メモリ内のJavaオブジェクトの分布については、別の記事で説明します。
  
  テクニカルピクチャ
  
  4.親クラスの参照は、子クラスオブジェクトを指します。
  
  参照とオブジェクトの関係を理解し​​た、質問があります。等号の左側にある宣言された型が等号の右側にあるインスタンス型と一致しない場合はどうなりますか?プログラムをスムーズにコンパイルして実行できるようにする場合は、等号の両側の型に互換性があることを確認する必要があります。完全に無関係な2つのクラスを等号の左側と右側に表示することはできません。コンパイルによる強制的な型変換を使用できたとしても、実行時に例外がスローされます。
  
  それで、子クラスと親クラスと互換性があるかどうかを考えましたか?サブクラス参照が親クラスオブジェクトを指す場合と、親クラス参照がサブクラスオブジェクトを指す場合の2つのケースがあります。
  
  サブクラス参照
  
  が親クラスオブジェクトを指すのはなぜですか?親クラスオブジェクトへのサブクラス参照ポイントは、次を参照します:等号の左側はサブタイプの宣言定義であり、等号の右側は親タイプのインスタンスです。第一に、そのような使用法は存在しないという結論であり、その理由を2つの側面から分析します。
  
  最初の側面は論理的ですか?つまり、Java言語で開発者にそのような使用法を提供する必要があるのでしょうか。明らかにいいえ、サブクラスを定義する目的は、親クラスの機能を拡張することです。その結果、現在、機能が不十分な古い親クラスインスタンス(等号の右側)を使用して、強力で機能的な(等号の左側にある)より強力なサブクラス宣言の必要性は明らかに不合理です。
  
  一方、プログラムの実行中に行うことはできますか?実際に関連するコードを記述する場合は、強制変換ステートメントを追加するように求められます。それ以外の場合はコンパイルに失敗し、合格しても、実行時に型変換を実行できないことを示すプロンプトが表示されます。これは、テキストメッセージの呼び出しと送信のみが可能な古いマシンを、さまざまなアプリをインストールできるスマートマシンに強制的に変換することと同じですが、これは明らかに不可能です。
  
  親クラス参照が子クラスオブジェクトを指すとはどういう意味ですか
  
  親クラス参照は子クラスオブジェクトを指します。等号の左側は親タイプの定義であり、等号の右側はサブタイプのインスタンスです。この状況はよく使用され、次のようなものです。インターフェースが実装クラスを指します。それでは、この使用法をどのように説明する必要がありますか。なぜそのような使用法があるのでしょうか。
  
  まず、これが何を意味するのかを理解しましょう。親クラスがグラフィックで、子クラスが長方形と円形の場合です。これは、グラフィックスオブジェクトを宣言したようなものです。現時点では、グラフィックスクラスで定義されたメソッドを呼び出すことができることがわかります。グラフィックスクラスは抽象クラスであるため、直接インスタンス化することはできません。2つのサブクラスを使用してのみ、やってみて。
  
  public class Test {
  
  public static void main(String [] args){
  
  // figure1はRectangleインスタンスを指します
  
  Figure figure1 = new Rectangle(5,10);
  
  System.out.println(figure1.getC()); //長方形の周囲を取得しますLong
  
  System.out.println(figure1.getS()); //長方形の領域を取得
  
  // figure2はCircleインスタンスを指します
  
  Figure figure2 = new Circle(5);
  
  System.out.println(figure2.getC()); // get円形の境界
  
  System.out.println(figure2.getS()); //円形の領域を取得します
  
  }
  
  }
  
  上記の結果から、サブクラスオブジェクトを指すサブクラス参照の実行効果に違いはないようです。ただし、現時点では親クラスの参照を利用しているため、サブクラスで独自のコンテンツを定義すると呼び出すことができない点が異なります。上記では、実行効果は等号の右側のインスタンスに基づいているため、結果が直接作成されたサブクラスインスタンスと同じであることを理解するのは難しくありません。
  
  その意味を説明することが重要です。Figureステートメントを使用すると、それが図であることだけがわかったので、実行できるメソッドがわかったということです。それを四角形であると指示すると、四角形の円周と面積を計算できます。それは円であり、円の円周と面積を計算することができます。このように記述することもできます。この図は長方形またはこの図は円です。
  
  プログラム操作の観点から説明すると、サブクラスオブジェクトがインスタンス化されるときに親クラスオブジェクトがインスタンス化されることはすでにわかっています。サブクラスが親クラスメソッドをオーバーライドすると、親クラスメソッドは非表示になります。親クラス参照を使用してサブクラスオブジェクトを指す場合、これはオブジェクトインスタンスに相当しますが、非常に強力ですが、関数の一部しか有効にできませんが、同じ命令、異なるサブクラスオブジェクトを実行できるという利点があります。そして、違いがあります。これは、電話をかける機能とテキストメッセージを送信する機能だけを備えた旧式のマシンに相当します。XiaomiフォンとMeizuフォンはどちらも、アップグレードされて拡張されたスマートフォンです。もちろん、これらは電話機の最も基本的な通信機能を保持しているため、問題なく使用できます。
  
  4番目に、ポリモーフィズム
  
  上記の内容を学習した、実際には、ポリモーフィズムの使用法をマスターしました。次に、それを明確に要約しましょう。
  
  1.
  
  ポリモーフィズムとは何ですか?ポリモーフィズムとは、インスタンス(サブクラスオブジェクトまたは実装クラスオブジェクト)の特定の実装が異なるため、同じ親クラスまたは同じインターフェースが同じ命令(同じメソッドと呼ばれる)を発行することを指します、パフォーマンスにはさまざまな形式があります(実行効果)。
  
  上記の例のグラフィックと同様に、それは抽象クラス自体であり、いくつかの抽象メソッドがあり、サブクラスオブジェクトによって特定の実行を完了することができます。抽象クラスの抽象メソッドの場合、サブクラスを書き換える必要があるため、親クラスの抽象メソッドを実行するサブクラスは必ず多態性の発現であり、それ以外の場合は必ずしも多態性を構成しないため、次の3つが必要です。状態。
  
  2.ポリモーフィズムに必要な条件
  
  サブクラスの継承関係があります
  
  サブクラスが親クラスを書き換えるメソッド
  
  親クラスの参照ポイントがサブクラスオブジェクトを指す
  
  これらの3つの条件が満たされた場合にのみ、この記事の最初の3つのポイントがポリモーフィックになります。スペースの理由。
  
  3.ポリモーフィズムの利点ポリモーフィズムの
  
  使用には多くの利点があります。特に、抽象クラスに複数のサブクラスがある場合、またはインターフェースに複数の抽象クラスがある場合、パラメーターを渡すときに非常に柔軟性があり、メソッドでのみ必要です。親の型を宣言として定義します。渡されるパラメーターは、親の型自体にすることも、対応する任意のサブタイプオブジェクトにすることもできます。したがって、ポリモーフィズムの利点は次のように要約できます。
  
  結合を減らす:親タイプの
  
  保守性(継承保証)に関連付けるだけでよい:特定のサブタイプを追加または変更するだけ
  
  でよく、他のクラスのスケーラビリティには影響しません。(ポリモーフィズム保証):サブクラスを使用すると、既存の関数の
  
  柔軟性のある
  
  インターフェースをすばやく拡張できます

おすすめ

転載: www.cnblogs.com/javabk6/p/12717262.html