0

以下のコードで:

public class Animal {
   ....// class stuff here
}

public class Cat extends Animal {
   ....// class stuff here
}

新しい Cat オブジェクトを作成しようとしたときの違いは何ですか?:

    Cat myCat = new Cat(); //and
    Animal myCat = new Cat();

私は以前に、左側で最も一般的なものを宣言する必要があるリストを読んだことがあります(つまり

List<String> = new LinkedList<String>();) そのため、代わりに ArrayList を使用するように実装を変更したい場合でも、変更するコードが少なくなります。

すべてのケースで、ラフト (この場合) で最も一般的な (最も具体的ではない) ものを常に宣言する必要がありますAnimal myCat = new Cat();か?

4

5 に答える 5

2

作るものに違いはありません。唯一の違いは、参照の型にあります。Animal への参照があり、Animal にない Cat のメソッドを使用しようとすると、コンパイラはエラーを返します。Cat でオーバーライドされた (注: オーバーロードとは異なります) メソッドを呼び出すと、参照が Animal であっても、Cat のメソッドが正しく呼び出されます。

于 2012-10-10T11:45:50.527 に答える
1

関連する最も具体的なもの。それ以外の場合、すべての変数は になりますObject

経験則として、ロジックで に固有のメソッドを呼び出す必要があるCat場合は、変数を として宣言する必要がありますCat。そうでない場合は、Animalのメソッドが必要な場合Animalなどになります。

于 2012-10-10T11:45:03.270 に答える
1

次のコードがあるとしましょう

public class Animal {
  public void doSomething() {
       // ...
  }
}

public class Cat extends Animal {
  public void miau() {
       // ...
  }
}

違いは

Cat myCat1 = new Cat(); //and
Animal myCat2 = new Cat();
myCat1.miau(); //ok
myCat1.doSomething(); //ok
myCat2.miau(); // doesn't compile
myCat2.doSomething(); // ok

どちらを使用するかは、状況によって異なります。例はリストです。このリストに猫だけを入れることがわかっている場合は、次のように宣言します。

ArrayList<Cat> list = new ArrayList<Cat>();

しかし、そこにあらゆる種類の動物を入れることがわかっている場合は、次のように宣言する必要があります

ArrayList<Animal> list = new ArrayList<Animal>();

次のこともできます。

ArrayList<Object> list = new ArrayList<Object>();

しかし、それは良いコーディング スタイルではありません。のようなメソッドを呼び出したいmiau場合は、最初に呼び出したい要素がCat. そして、それをキャストする必要さえあります。

于 2012-10-10T11:45:15.157 に答える
1

の違い

Cat myCat = new Cat(); //and 
Animal myCat = new Cat();

前者は具体的な実装をプログラミングしているのに対し、後者はインターフェイス/スーパータイプをプログラミングしています。

この後者のアプローチは、実際のランタイム オブジェクトがコードにバインドされないようにするために推奨されます。また、動物クラスを使用するクラスは、実際の動物オブジェクトについて知る必要はありません (猫だけではなく、かなりの数になる可能性があります)。

したがって animal.makeSound()、動物をポリモーフィックに参照する後者で行うことができます(猫/あなたの場合は他の動物)

于 2012-10-10T11:51:03.650 に答える
0

レイマンの言語で説明するために、それはすべてあなたが望むものに依存することを、私が提供したリンクからあなたが得ることができる残りの説明のために、私は非常に簡単な例を挙げます。

  • バスケットに猫が何匹いるかを計算したい場合は、もちろん2番目のケースを使用することはできません。参照を作成しList<Cat>て保存する必要があります。参照は右を指すこともできるので?? したがって、aは..を保持できます。したがって、Cat ..の正しいカウントを取得できない場合があります。または、取得することはできますが、もう少し作業が必要です。CatAnimalDogList<Animal>Dog

  • また、さまざまな種類の動物の総数など、一般的な情報が必要Animalな場合は、最初の動物と一緒に楽しく移動できますAnimal。参照を使用してオブジェクトを作成します。これで、すべての動物を保持できます。

于 2012-10-10T11:49:36.037 に答える