0

私はこのコードを書きました

class Flower{
  String name = "Flower";
  void print(){System.out.println("Flower method");}
}

class Rose extends Flower{
  String name = "Rose";
  void print(){System.out.println("Rose method");}
}

....
//Another class in same default package
public static void main(String... args){
  Flower f = new Rose();
  f.print();
  System.out.println(f.name);
}

このコードの出力は次のようになると予想していました。

Flower method
Flower

しかし、代わりに印刷されました

Rose method
Flower

私の経験則では、これらの「下位」タイプのいずれかを参照として使用すると、それらのメンバーのみがオブジェクトに表示されます。残りにアクセスするには、キャストする必要があります。しかし、メソッドの扱いが異なるようですか?

4

5 に答える 5

3

あああああああああああああああああああああああああああああああああああああああああ…ポリモーフィズム OOP の優れた機能の 1 つです。ステップバイステップの説明:

  1. クラスが派生クラスであり、基本クラスである単一継承を使用しています。RoseFlower
  2. スーパークラスと派生クラスの両方に同じ名前のメソッドがある場合、デフォルトでは、スーパークラスのメソッドではなく、派生クラスのメソッドが呼び出されます。それらはOver-riddenデフォルトです。
  3. スーパークラスのフィールドは、単純な名前では参照できません。代わりに、スーパーを通じてフィールドにアクセスする必要があります。

次の理由により、出力が得られます。

  1. f.print()FlowerではなくRoseのメソッドを呼び出します。の花を呼び出す必要がある場合は、それに応じて使用できます。print()super.print()
  2. f.nameは掲載Flowerしているため、の種類fFlowerありませんRose。次のようなメソッドを使用してアクセスできます。
    public String getName()
    {
      this.name を返します。
    }

それに応じて使用します。System.out.println(f.getName);

編集:素人の言葉でそれを理解するために、@ Juned Ahsanの答えは非常にシンプルで明確です:

Flower f = new Rose();

fは新しいであるためRose、ステートメントf.print()は のメソッドを呼び出しますRose

言及する価値があると思いました。:)

ポリモーフィズムについて調べてみてください。参考文献は山ほどあります。:)

于 2013-10-09T09:55:53.137 に答える
2

フィールドはメソッドのように多態的ではありません

ここで、同じフィールド名との混乱。

Java 言語仕様#シャドウイング。

ドキュメントの発言

クラス内で、スーパークラスのフィールドと同じ名前のフィールドは、型が異なっていても、スーパークラスのフィールドを隠します。サブクラス内では、スーパークラスのフィールドを単純な名前で参照することはできません。代わりに、スーパーを介してフィールドにアクセスする必要があります

あなたの場合、スーパーカルスによって隠されているname クラスのフィールドRoseFlower

于 2013-10-09T09:32:16.140 に答える
1
Flower f = new Rose();

fのオブジェクトを保持しているため、次のように呼び出されるとRose、のオーバーライドされたメソッドRoseが呼び出されます。

  f.print();

そして印刷されますRose method

fは花の参照であり、オーバーライドはインスタンス フィールドの概念ではmethodsなく、インスタンス フィールドのみの概念であるため、

  System.out.println(f.name);

印刷しますFlower

于 2013-10-09T09:31:52.437 に答える
0

クラス Rose のクラス Flower の print メソッドをオーバーライドしています。そのため、この出力が得られます。

于 2013-10-09T09:31:44.583 に答える
0

「動的ポリモーフィズム」を使用すると、スーパークラス参照はサブクラス オブジェクトを保持します。あなたの場合、Roseオブジェクトはfです。

Flower f = new Rose();
          f.print();

print メソッドを呼び出すと、実際には Rose クラスの print メソッドが呼び出されます。

于 2013-10-09T09:39:36.460 に答える