2017-07-22 1 views
2
class Animal { 
    String color = "white"; 
} 

class Dog extends Animal { 
    void printColor() { 
     System.out.println("This Color: " + color); //prints color of Dog class 
     System.out.println("Parent Color: " + super.color); //prints color of Animal class 
    } 
} 

class TestSuper1 { 
    public static void main(String args[]) { 
     Dog d = new Dog(); 
     d.color = "black"; 
     d.printColor(); 
    } 
} 

"Parent Color"の出力では "black"という文字が混乱します。子オブジェクトの色のみを変更したので、「白」にする必要がありますか?誰でも私に理由を説明してもらえますか?下のJavaオブジェクトで現在のオブジェクトをスーパーリファイルするのはなぜですか?

+0

を印刷します。 (それはまた、*助けを求めていないときには良い考えです。)私はあなたのためにそれを再フォーマットしました。 –

+0

ありがとう!将来はそれを世話するだろう。 – Rajeesh

答えて

1

colorは、スーパークラスAnimalで1回のみ宣言されます。 Dog自体にはスロットcolorがありません。

Dogはサブクラスなので、Animalからスロットを継承します。

1

はオブジェクトがあり、それが唯一 color部材を有します。 thisを経由して、それを参照する(あなたが暗黙のうちにあるとして、printColorcolorthis.colorの内側に同じものです)との唯一の違いやsuperを経由して、あなたがそれとその型情報がどのように使われるかの周りのいくつかの詳細を持っている参照のタイプです。あなたはまだ同じオブジェクトを参照しています。そのオブジェクトにはcolorというメンバーが1つしかありません。 1つしかないので、thisまたはsuperでアクセスできますが、同じ結果が得られます。

+0

スーパークラスオブジェクトは、子クラスオブジェクトの作成時に最初に作成されますか?ここで、このスーパークラスオブジェクトを作成し、そのスーパークラスオブジェクトの 'color'の値を出力する方法はありますか? – Rajeesh

+0

@Rajeesh:いいえ。ここでも、スーパークラスとサブクラスの両方で定義されたすべての機能を持つオブジェクトが1つしかありません。別々のオブジェクトはありません。これはプロトタイプの継承ではなく、クラスベースの継承です(SelfやJavaScriptなどの他の言語で使用されています)。 –

3

それだけ

あなたは2つのオブジェクトが、1

colorは、子クラスに継承されていない、私は子供 オブジェクトの色を変更している右側のため、「白」でなければなりません。
super.colorまたはcolorを呼び出すことは、単一のcolorフィールドと同じことです。

Dogクラスにcolorフィールドを追加し、それが明確な結果を生成します:あなたが書いたときに今、あなたは二つの異なる出力が得られます

class Dog extends Animal { 
    ... 
    String color = "white"; 
    void printColor() { 
     System.out.println("This Color: " + color);// prints color of Dog class 
     System.out.println("Parent Color: " + super.color);// prints color of Animal class 
    } 
} 

を:

Dog d = new Dog(); 
d.color = "black"; // modify the color field of Dog not which one of Animal 
d.printColor(); 

最初の出力としてDogフィールドを参照し、2番目の出力はAnimalフィールドを参照します。

+0

@Downvoter私は自分の答えをどのように改善することができますか? – davidxxx

+0

フィールドオーバーライドを導入することは、質問に表示されていないときには、遠隔的に役立つとは思いません。それは、すでに別のオブジェクトがあると思っている人をさらに混乱させます。 –

+0

@ T.J。私はあなたを得ます。私はサブクラスに新しいフィールド宣言を導入しました(インスタンスフィールドはオーバーライドされません)。OPがどのように結果を得ることができるかを示します。単一のオブジェクトとそのために単一の 'color'フィールドが作成/使用されたことを説明しています。私は、2人目だけが何かを見逃しているという印象を持っていました... – davidxxx

0

フィールドcolorのみ親クラスAnimalに定義されているので、その子クラスDogの目的は「黒」と子クラスにその値がに「黒」に印刷されます理由です名前の色のない分野を持っていないし、その値を設定します両方の場合。しかし、フィールドString color = "brown";Dogクラスに定義すると、出力はDogの場合は黒色、Animalの場合は白色になります。

+0

私の質問は、なぜsuper.colorは子クラスが独自のカラープロパティを持っていない場合に '白'を印刷しないのですか? – Rajeesh

0

以前の回答は、コード内で何が起きているかを既に説明しています。

super.xxxの使用は何ですか?つまり、現在のthisオブジェクトを取得しますが、スーパークラスのメソッドとフィールドの宣言を使用します(多かれ少なかれ)。

superは、メソッドが親の継承したメソッドをオーバーライドするメソッドで使用されますが、まったく新しい動作をしたくない場合は、親の実装に機能を追加するだけです。

class Animal { 
    String color = "white"; 
    void printColor() { 
     System.out.println("Animal color: " + color); 
    } 
} 

class Dog extends Animal { 
    void printColor() { 
     // Animal class prints the color 
     // Dog class remarks that it's a dog 
     System.out.println("I am a Dog!"); 
     super.printColor(); 
    } 
} 

class TestSuper1 { 
    public static void main(String args[]) { 
     // declaring d as Dog or Animal doesn't matter 
     Animal d = new Dog(); 
     d.color = "black"; 
     d.printColor(); 
    } 
} 

これは助けを求めるときは、一貫して読み取り可能にコードをインデントするために時間がかかるしてください

I am a Dog! 
Animal color: black 
関連する問題