4

誰かがこれが起こっている理由を説明できますか?

class Apple {

   String type;

   setType(){
      System.out.println("inside apple class");
      this.type = "apple";
   }

}

class RedApple extends Apple {

    String type;

    setType() {
      System.out.println("inside red-apple class");
       this.type = "redapple";
    }
}

int main {

    RedApple red = new RedApple();
    Apple apple = (Apple) red;
    apple.setType();

}

ただし、生成される出力は次のとおりです。

"inside red-apple class”

ご覧のとおり、アップキャストしているのに、なぜ.setType()メソッドはスーパークラスメソッドではなくサブクラスメソッドを実行するのですか?

4

4 に答える 4

5

これは、Javaでポリモーフィズムが機能する方法であるためです。これは、他のバージョンをオーバーライドする、メソッドの最も派生したバージョンを常に使用します。基本クラスのバージョンを取得する唯一の方法はsuper.setType、最も派生したオーバーライド内で使用することです。

于 2011-07-18T05:49:27.990 に答える
2

これは、あらゆる OOP 言語の基本的な機能です。そのため、ポリモーフィズムを実装するために、C++ のすべてのデコンストラクターを仮想にする必要があります。適切なメソッドが呼び出されるようにします。 これは、それがどのように機能するかを理解するための良い記事です

于 2011-07-18T05:55:59.757 に答える
1

これはポリモーフィズムです。メソッドをオーバーライドしたため、そのオブジェクトでそのメソッドを呼び出すたびに、たとえそれがスーパー クラスにキャストされていても、最も子のメソッドが呼び出されます。

ただし、アップキャストが違いを生む例は次のとおりです。

class MyClass {
    static void doSomething(Apple apple) { System.out.println("Apple"); }
    static void doSomething(RedApple apple) { System.out.println("RedApple"); }
}
...
RedApple apple = new RedApple();
MyClass.doSomething(apple);
MyClass.doSomething((Apple)apple);

出力:

RedApple
Apple

それを Apple にアップキャストするので、最適な方法は Apple パラメータを持つものです。

于 2011-07-18T05:58:12.053 に答える
0

これは、Java が動作するように設計された方法であり、メソッドのオーバーライド動作と呼ばれます。スーパークラスにメソッドが必要な場合は、同じシグネチャを持つ親クラスと子クラスの両方でメソッド表示の静的メソッドを使用できます。

于 2011-07-18T06:53:09.137 に答える