[JAVAの定義]オブジェクト向けプログラミング-多形性


たけいせい


1つのタイプの参照変数として複数のタイプのオブジェクトを参照します.
祖先クラスタイプの参照変数として、サブクラスのインスタンスを参照できます.

これは、親クラスの参照変数を使用して子クラスを参照する例です.
CaptionTv c = new CaptionTv();
TV t = new CaptionTv();
同じタイプのインスタンスですが、参照変数タイプ(CaptionTv,TV)は使用可能なメンバーの数を変更します.
逆に、サブタイプの参照変数は祖先タイプのインスタンスを参照できますか?
あり得ない.
子クラスのメンバー数が親クラスより多いため、コンパイルエラーが発生します.参照変数で使用可能なメンバー数は、インスタンス内のメンバー数と等しいか少ない必要があります.

参照変数に変換

  • は、互いに継承関係のあるクラス間でのみ変換できます.
  • サブタイプ→祖先タイプ:変換を省略可能
    祖先タイプ→子孫タイプ:変形は生成できません

    次のように継承関係を持つクラスがあるとします.
    FireEngine f;
    Ambulance a;
    
    a = (Ambulance)f;
    f = (FireEngine)a;
    FireEngineとAmubulanceは兄弟関係のように見えますが、Javaでは子孫-祖先関係しかないので、継承関係ではないので変換することはできません.
    Car car = null;
    FireEngine fe = new FireEngine();
    FireEngine fe2 = null;
    
    car = fe; // (Car)fe에서 (Car)가 생략된 것 → 자손에서 조상으로의 형변환
    fe2 = (FireEngine)car; // 조상에서 자손으로 형변환할 경우 생략하면 안된다.
    成形遷移は、インスタンスを変換するのではなく、参照変数のタイプを変更するため、参照変数の成形遷移はインスタンスに何の影響もありません.
    参照変数の変形のみを参照して、参照インスタンスで使用可能なメンバーの範囲を調整します.

    instanceof演算子


    なぜ
  • instanceof演算子を使用するのですか?
    :メソッドを呼び出すと、パラメータrollクラスが渡されますが、メソッドでは具体的にどのインスタンスなのか分かりません.そのため、instanceof演算子を使用して参照変数が指すインスタンスのタイプをチェックし、適切な変換を行います.
  • (参照変数instanceofタイプ)がTrueの場合は、参照変数チェックのタイプ(クラス)に変換できます.

    参照変数をインスタンスに関連付ける


    同じ名前のインスタンス変数とメンバー変数が親および子で定義されている場合、参照変数に基づいて異なる結果が得られます.
    親の参照変数の場合、親の宣言メンバー変数
    サブクラスの参照変数の場合は、サブクラスの宣言済みメンバー変数を使用します.

    列挙変数の多形性


    クラスが次のように定義されている場合:

    Buyメソッドでは,パラメータ実装メソッドが必要である.しかし、欠点は、これはコードが長く、機能が同じ方法であり、複数のコードも必要であることである.このように,種類が増えるたびに新しい方法を追加する必要があり不便である.
    ただし、パラメータが祖先クラスのサブタイプの参照パラメータである場合は、任意のパラメータを受け入れることができます.