2017-10-07 19 views
0

この次のコードのように出力を与える:親クラスオブジェクトに子クラスオブジェクトが割り当てられるとどうなりますか?

Output: 
    Animal 
    Dog 
    Animal 

私も代入「A = B」の後に「動物」として、なぜ「a.type」出力混乱しています。それはなぜそうですか?

Dogクラスの中に変数 "String type"を宣言しないと、別の観察がありました。その後、私はのような出力が得られます。

Output: 
     Dog 
     Dog 
     Dog 

マイコード:

//Parent class 
    class Animal { 
     String type; 
     public Animal(){ 
      this.type= "Animal"; 
     } 

    } 

    //Child class 
    class Dog extends Animal { 

     String type; 
     public Dog(){ 
      this.type ="Dog"; 
     } 

    } 

    //Main Class To Test 
    class TestDog{ 


      Animal a = new Animal(); 
      Dog b = new Dog();   
      Animal c = new Dog();  

      a = b; 
      System.out.println(a.type); 
      System.out.println(b.type); 
      System.out.println(c.type); 


    } 
+0

' "親クラスのオブジェクトは、子クラスのオブジェクトが割り当てられたときに何が起こる?"' - *エヘン*、してください親クラスの***変数***に子クラスオブジェクトを割り当てていることを理解してください。これは厄介なように見えるかもしれませんが、それは重要な違いです.JOPがOOPを実装し、* reference *変数をどのように使用するかのコアになります。また、親の型はクラスではないかもしれませんが、インタフェース( "純粋な"型)である可能性があります。 –

+0

親クラスと子クラスの両方に型フィールドを追加しています。しないでください。親にのみ追加してください。それを保護するか、ゲッタとセッタを与える。 –

答えて

0

まず教訓ポイント。あなたのタイルには:

親クラスオブジェクトに子クラスオブジェクトが割り当てられるとどうなりますか?

親クラスの変数に子クラスオブジェクトを割り当てていることにご注意ください。これは厄介なように見えるかもしれませんが、それは重要な違いです.JOPがOOPを実装し、参照変数を使用する方法の中核になります。また、親の型はクラスではないかもしれませんが、インタフェース( "純粋な"型)である可能性があります。

あなたの混乱は、親と子の両方のクラスに型フィールドを追加することです。フィールドはオーバーライドされていないので、しないでください。親にのみ追加してください。それを保護するか、ゲッタとセッタを与える。例えば

class Animal { 
    private String type; 

    public Animal() { 
     this.type = "Animal"; 
    } 

    public String getType() { 
     return type; 
    } 

    public void setType(String type) { 
     this.type = type; 
    } 

} 

// Child class 
class Dog extends Animal { 

    String type; 

    public Dog() { 
     setType("Dog"); 
    } 

} 

// Main Class To Test 
class TestDog { 
    public static void main(String[] args) { 

     Animal a = new Animal(); 
     Dog b = new Dog(); 
     Animal c = new Dog(); 

     a = b; 
     System.out.println(a.getType()); 
     System.out.println(b.getType()); 
     System.out.println(c.getType()); 
    } 

} 
+0

答えをありがとう!それは私の混乱を解消した。 – Sravani