4

なぜ異なるタイプのオブジェクト参照が許可されているのだろうか?例えば;

Animal cow = new Cow();

異なるタイプのオブジェクト参照を使用することが役立つ例を教えてください。

編集:Cow extends Animal

4

7 に答える 7

10

これは、ポリモーフィズムと抽象化の中心です。たとえば、それは私が書くことができることを意味します:

public void handleData(InputStream input) {
    ...
}

...そして、ファイル、ネットワーク、メモリ内などからのあらゆる種類の入力ストリームを処理します。または、同様に、を持っている場合List<String>は、実装などに関係なく、その要素0を要求できます。

サブクラスのインスタンスをスーパークラスのインスタンスとして扱う機能は、リスコフの置換原則と呼ばれます。緩い結合とコードの再利用が可能になります。

詳細については、Javaチュートリアルのポリモーフィズムの部分もお読みください。

于 2012-11-30T07:35:30.320 に答える
2

これはポリモーフィズムと呼ばれ、Javaの最も強力な側面の1つです。

ポリモーフィズムを使用すると、さまざまなオブジェクトを同じように扱うことができます。

これは、再利用可能で柔軟なコードを作成するための優れた方法です。

残念ながら、新しいプログラマーが理解するのに時間がかかることが多いのはJavaの一部です。

提供した例には、継承(クラスの拡張)が含まれます。

ポリモーフィズムの利点を享受するもう1つの方法は、インターフェースを使用することです。

同じインターフェースを実装する異なるクラスは、同じように扱うことができます。

class Dog extends Animal implements Talker {
    public void speak() {
        System.out.println("Woof woof");
    }
}

class Programmer implements Talker {
    public void speak() {
        System.out.println("Polymorphism rocks!");
    }
}

interface Talker {
    public void speak();
}

public static void testIt() {
    List<Talker> talkerList = new ArrayList<Talker>();
    talkerList.add(new Dog());
    talkerList.add(new Programmer());
    for (Talker t : talkerList) {
        t.speak();
    }
}
于 2012-11-30T07:43:47.543 に答える
2

簡単に言えば、これによりポリモーフィズムが可能になります。たとえば、Animalから派生した複数のオブジェクトを作成でき、すべてが同様のハンドルになります。

あなたは次のようなものを持つことができます:

Animal[] myAnimal = {new Cow(), new Dog(), new Cat()};

foreach (Animal animal in myAnimal)
   animal.Feed();

次に、Feed()メソッドを各子クラス内でオーバーライドする必要があります。

ちなみに、コードはC#に似ていますが、概念はJavaでも同じです。

于 2012-11-30T07:44:36.427 に答える
2

これは基本的に標準化の概念です。

私たちは、各動物がいくつかの共通の特徴を持っていることを知っています。食べたり寝たりする例を見てみましょう。しかし、動物ごとに食べ方や寝方が異なる場合があります。

public abstract class Animal
    {
         public abstract void Eat();
         public abstract void Sleep();

    }
    //Now Define them in various classes..

     public class Cow extends Animal
    {
         pubic void Eat()
         {
            //process of eating grass
         }

         public void Sleep()
         {
            //process of sleeping
         }
    }

   public class Lion extends Animal
   {
         public void Eat()
         {
            //process of eating flesh
         }

         public void Sleep()
         {
            //process of sleep
         }
   }

これで、異なるクラスに異なるオブジェクトを定義する必要はありません...動物を使用して一般的に呼び出すだけです

public class MyClass
  {
      public static void main(String[] args)
      {
           Animal _animal = new //think the type of animal is coming dynamically 
          //you can simply call 
          _animal.Eat();
          _animal.Sleep();
          // irrespective of checking that what can be the animal type, it also reduces many if else
       }
  }
于 2012-11-30T07:57:58.367 に答える
1

別のクラス/メソッドでは、同じインターフェースの異なる実装を使用したい場合があります。あなたの例に従うと、あなたは次のようなものを持っているかもしれません:

public void feed( Animal animal ) {   
  animal.getHome().insertFood(animal.getFavFood());
}

これで、動物クラスに詳細を実装でき、プログラムに新しい動物を追加するたびにこのメソッドを拡張する必要はありません。

したがって、実装ごとにメソッドを実装しないために共通のインターフェースが必要な場合もあれば、明示的な実装を使用する必要がある場合もあります。

于 2012-11-30T07:37:02.653 に答える
1

簡単に言えばすべてCowsですAnimals。したがって、JAVACow extends Animalは、牛が動物と呼ばれることもあることを理解しています。

他の人が指摘しているように、これはポリモーフィズムです。あなたは拡張AnimalDogて、犬も動物であると言うことができます。

于 2012-11-30T07:40:20.210 に答える
1

これは継承101の質問です。

これにより、共通の機能を共有するオブジェクトを同様に扱うことができます。
また、抽象型のサブクラスである特定の実装を実行時に提供することもできます。

私はおそらく何年もの間歩き回ることができたでしょう。おそらく、このように質問はここで答えるには広すぎます。

于 2012-11-30T07:40:44.423 に答える