Java多型
多型には2つのタイプがあります。
(1)編集時間多型(設計時間多型):メソッドオーバーロード。
(2)ランタイム多型:Javaランタイムシステムは、ランタイム多型と呼ばれるメソッドを呼び出すインスタンスのタイプに基づいて呼び出す方法を決定します。 (私たちが通常話すことはランタイム多型であるため、多型は主にランタイムの多型を指します)
実行時に多型の存在に必要な3つの条件:
1.継承(インターフェイスの実装を含む)が必要です。
2。書き換えなければなりません。
3.親クラスの参照は、子クラスオブジェクトを指します。
多型の利点:
1。代替性。多型は、既存のコードに交換可能です。たとえば、多型はサークルサークルクラスで機能し、サークルなどの他の円形の形状でも機能します。
2。拡張性。多型はコードにスケーラブルです。新しいサブクラスを追加しても、既存のクラスの多型、相続、およびその他の特性の操作と操作には影響しません。実際、新しいサブクラスを追加することにより、多型機能を取得する方が簡単です。たとえば、コーン、セミコーン、半球の多型を実現することに基づいて、球体の多型を簡単に追加できます。
3。インターフェイス能力。多型は、メソッドシグネチャを介してスーパークラスによって達成され、サブクラスに共通のインターフェイスを提供し、サブクラスがサブクラスによって実装され、それを改善または上書きします。図8.3に示すように。図では、スーパークラスの形状は、多型、ComputEEREA()とComputeVolume()を実装する2つのインターフェイスメソッドを指定します。サークルや球体などのサブクラスは、多型を達成するために、これら2つのインターフェイス方法を改善またはオーバーライドします。
4。柔軟性。アプリケーションでの柔軟で多様な操作を反映し、使用効率を向上させます。
5。シンプルさ。多型は、特に多数のオブジェクトの操作と操作を扱う場合、アプリケーションソフトウェアのコード作成プロセスと変更プロセスを簡素化します。この機能は特に顕著で重要です。
注:優先度は高から低いものです:this.show(o)、super.show(o)、this.show((super)o)、super.show((super)o)。
関連インタビューの質問:
クラスA {public String show(d obj).. {return( "a and d"); } public string show(a obj).. {return( "a and a"); }} class Bはa {public string show(b obj).. {return( "b and b"); } public string show(a obj).. {return( "b and a"); }} class c拡張b ... {} class d extends b ... {}(2)質問:次の出力の結果は何ですか?
a1 = new a();
a2 = new b();
b b = new b();
c c = new c();
d d = new d();
System.out.println(a1.show(b)); ①
System.out.println(a1.show(c)); ②
System.out.println(a1.show(d)); ③
System.out.println(a2.show(b)); ④
System.out.println(a2.show(c)); ⑤
System.out.println(a2.show(d)); ⑥
System.out.println(B.Show(b)); ⑦
System.out.println(B.Show(c)); ⑧
System.out.println(b.show(d)); ⑨
(iii)答え
①aおよびa
②aおよびa
③aおよびd
④bおよびa
⑤bおよびa
⑥aおよびd
⑦BおよびB
⑧BおよびB
⑨aおよびd
分析:
この種の質問をするときは、常に優先順位を使用する必要があります。
質問1について:
A1はクラスAのインスタンス化されたオブジェクトであるため、これはAを指してから、これを探します。方法がないので、それはsuper.show(b)に行きます。ただし、クラスAにはスーパークラスがないため、this.show(super b)に行きます。 BのスーパークラスはAであるため、これに相当します。次に、この方法はクラスAに見られるため、AとAは出力です。
質問2について:
同様に、A1はクラスAのインスタンス化されたオブジェクトであるため、これはAを指してから、クラスAでshow(c)メソッドを検索します。そのような方法はないため、super.show(c)に行きます。クラスAのスーパークラスでこれを探しているので、Aにはスーパークラスがないので、これに行きます。 CのスーパークラスはBであるため、クラスAのshow(b)メソッドを探しますが、見つかりませんでした。それから、Bにはスーパークラスもあります。これはaなので、これを探します。
質問3について:
同様に、A1はクラスAのインスタンス化されたオブジェクトであるため、これはAを指してから、クラスAでshow(d)メソッドを見つけます。
質問4について:
A2はタイプAを持つクラスBの参照オブジェクトであるため、これはクラスAを指してから、クラスAでshow(b)メソッドを見つけますが、見つかりません。クラスAにはスーパークラスがないため、これが到着します。 BのスーパークラスはA、つまりスーパーB = Aなので、この方法を実行します。 show(a)、show(a)in method aでshow a and fikeを探しますが、a2はクラスBの参照オブジェクトであり、クラスBはクラスAのショー(a)方法をカバーしているため、クラスBの最終実行(a)メソッド、つまり出力Bとa;
質問5について:
A2はタイプAを持つクラスBの参照オブジェクトであるため、これはクラスAを指し、クラスAのshow(c)メソッドを探しますが、それは見つかりませんでした。クラスAにはスーパークラスがないため、それはBですので、それはBです。したがって、クラスAで見つかりますが、見つかりません。 Bにはスーパークラスもあります。つまり、A、つまりクラスAのショー(a)メソッドを探し続けますが、A2はクラスBの参照オブジェクトであり、クラスBはクラスAのショー(a)方法をカバーしているため、最終的に実行されます。ショー(a)クラスBのメソッド、つまりBとAの出力。
質問6について:
A2はタイプAを持つクラスBの参照オブジェクトであるため、これはクラスAを指してから、クラスAでshow(d)メソッドを見つけて見つけました。ただし、A2はクラスBの参照オブジェクトであるため、クラスBにあるため、クラスBにオーバーライドされたショー(D)メソッドがあるかどうかがわかります。したがって、クラスAのショー(d)メソッド、つまり出力aおよびd。
質問7について:
BはクラスBのインスタンス化されたオブジェクトです。首相はこれを実行します。ショー(b)、クラスBのショー(b)メソッドを探し、それを見つけ、BとBを直接出力します。
質問8について:
BはクラスBのインスタンス化されたオブジェクトです。首相はこれを実行し、クラスBのショー(c)メソッドを探しますが、Super.show(c)に行くときは見つかりません。ショー(b)クラスBのFメソッド、私は見つけたので、クラスBでショー(b)メソッドを実行すると、BとBの出力が出力されました。
質問9について:
BはクラスBのインスタンス化されたオブジェクトです。首相はこれを実行します。ショー(d)、クラスBのショー(d)メソッドを探しますが、それは見つかりません。したがって、私はsuper.show(d)に行きました。
これは、インターネットで質問を読んだ後に要約した方法です。誰にとっても有益であることを願っています。
読んでくれてありがとう、私はそれがあなたを助けることができることを願っています。このサイトへのご支援ありがとうございます!