2

私は本SCJPからこのコードを持っています:

1.  class Mammal {
2.    String name = "furry ";
3.    String makeNoise() { return "generic noise"; }
4.  }
5.  
6.  class Zebra extends Mammal {
7.    String name = "stripes ";
8.    String makeNoise() { return "bray"; }
9.  }
10.
11. public class ZooKeeper {
12.   public static void main(String[] args) {
13.     new ZooKeeper().go();
14.   }
15.   
16.   void go() {
17.     Mammal m = new Zebra();
18.     System.out.println(m.name + m.makeNoise());
19.   }
20. }

このコードを実行した結果は「毛皮のようなブレイ」です。

質問1

17行目がそうでない理由がわかりません:Zebra zebra2 = new Zebra();

次の各場合の目的は何ですか、いつどのように使用しますか?

Mammal zebra1 = new Zebra();

vs

Zebra zebra2 = new Zebra();   

質問2

クラスの変数name = "stripes"がクラスのからZebraオーバーライドされるのはなぜですか?私は反対を期待しています:サブクラスからの変数はスーパークラスからの変数をオーバーライドします。name = "furry"Mammal

4

3 に答える 3

6

回答1

Mammal zebra1 = new Zebra();派生クラスのオブジェクトを親クラスの型の変数に割り当てることができることを示すために使用されます。これも理由です。Mammalから派生しMammal mたクラスを作成して、に割り当てることもできるからです。クラスのオブジェクトまたはから派生した任意のクラスを保持できます。LionmmMammalMammal

回答2

これは継承とも関係があります。を出力するm.nameと、mは、クラスMammalのそのプロパティの値を取得します。Mammal継承によって変数をオーバーライドすることはできず、メソッドのみをオーバーライドできます。getName()両方がを返すメソッドを両方のクラスに追加するとnamem.getName()はを返し"stripes"ます。

于 2012-08-27T08:12:24.860 に答える
1
  1. なぜならZebra _ Mammal

  2. 変数はオーバーライドできません。15行目を次のように変更した場合:

    System.out.println(((Zebra) m).name + m.makeNoise());

    あなたが得るでしょうstripes bray

于 2012-08-27T08:13:59.330 に答える
1

回答1:必要なものによって異なります。この場合、それはそれほど明白ではありません。ただし、オブジェクトをクラス1またはクラス2から外したい場合があります。たとえば、哺乳類ではなくゼブラにメソッドがあり、そのメソッドを使用したい場合は、オブジェクトを哺乳類ではなくゼブラクラスから外す必要があります。ただし、哺乳類の変数のみを受け入れるメソッドを持つサードパーティのクラスがある場合は、哺乳類のオブジェクトを渡す必要があります。

Answer2:m.nameは哺乳類の変数(オーバーライドできません)であり、m.makeNoise()はメソッドであり、これはZebraでオーバーライドされます。

于 2012-08-27T08:20:28.513 に答える