2016-10-22 28 views
1
class Person { 
    public String name; 
    String id; 

    public Person() { 
     System.out.println("Parent default"); 
     name = id = ""; 
    } 

    public Person(String name, String id) { 
     System.out.println("Parent parameter"); 
     this.name = name; 
     this.id = id; 
    } 

    void show() { 
     System.out.println(this.name + "\n" + this.id); 
    } 
} 

class Student extends Person { 

    Student() {} 

    Student(String a, String b) { 
     super(a, b); 
    } 
} 

class Main { 
    public static void main(String args[]) { 
     Person p = new Person("A", "AA"); 
     Student s = new Student("b", "BB"); 
     s.show(); 
    } 
} 

私は非常にJavaに新しいので、いくつかの基本的なことを理解したかったのですが、失敗しました。親クラスから継承すると、これは子クラスの親クラスのコピーを取得することを意味します。つまり、このコードでは、親クラスのshowメソッド(Mainクラス)を参照すると、前に設定した親クラス 'nameidが表示されます。サブクラスのインスタンスからスーパークラスのプロパティにアクセスする

しかし、それは表示されていないので、私は確かに私の理解に問題があります。どのように私は子クラスから親クラスのコピーにアクセスできますか?子のコンストラクタのsuperメソッドを使用していますか?私はまた、簡単に継承の基礎を知りたい。

+1

あなたが名前 "b" およびID "BB" と 'Student'を作成しました。 'show'の呼び出しはこれらの情報を出力します。あなたは何を期待したのですか? – Seelenvirtuose

+0

私はSuper(a、b)をStudent(String a、String b)コンストラクタから呼び出しました。親クラスの名前とIDをsuperキーワードでどのように出力できますか? – inhaler

+0

とスーパー(a、b)私は親のパラメータ化されたコンストラクタ - r8を呼び出していますか? – inhaler

答えて

3

は、次の文を考えてみましょう:

Person p = new Person("A", "AA"); 

これはPersonを作成しています。その名前は"A"で、そのIDは"AA"です。

は今この文を考えてみます。

Student s = new Student("b", "BB"); 

これは新しいStudentを作成しています。 新しいPersonを作成しています。そんなことがあるものか?よくa Student a Personです。それが継承の意味です。型が別の型を継承している場合、型間の関係は""です。

犬は動物であるため、犬は動物を拡張します。 CarはVehicleであるため、CarはVehicleを拡張します。

したがって、新しいStudentを作成すると、Personが作成されます。 Student extends Personなので、StudentPersonです。驚くことではないが、私は追加するかもしれない。

superキーワードは、子クラスの親クラスのメソッドとフィールドを参照するために使用されます。あなたのStudentコンストラクタ

Student(String a, String b) { 
    super(a, b); 
} 

では、実際には間接的にsuper(a, b)を呼び出すことによってPersonコンストラクタを呼び出しています。したがって、new Student("b", "BB")は、というIDと"BB"という名前のPersonを作成します。そのPersonStudentになります。

"a"と人"b"との間に実際の関係はありません(彼らはおそらく遠いいとこかもしれませんが)。彼女の名前は"a"人に尋ねると、彼女は"a"に返信します。彼の名前のために人"b"を尋ねるならば、彼は"b"と答えます。ある人に他の人の名前で返信させるのはちょっと奇妙なので、個人はまったく違った人として扱われます。


も参照してください:Java Inheritance Documentation

+0

うわー!!ありがとう 。これは継承の基本をクリアします^ _^@nbrooks – inhaler

2

あなたの子クラス 'Student'は親からshowメソッドを継承しています。

したがって、学生のオブジェクトを作成したときに、いくつかの値がbとBBの場合、それらの値が表示されました。

super(a、b)を呼び出してから、親クラスから取得されたshow()メソッドを使用して表示されるので、学生の値はstudentからparentに渡されます。

希望すると、これが役立ちます。

+0

私のコードで私は子供のクラスのコンストラクタから親のコンストラクタを呼び出すことができ、SUPERキーワードで親のコピーを取得する方法はありますか? – inhaler

+0

あなたはすでにそれをやっています。 :) Student(String a、String b)はあなたの子コンストラクタです。それの体の中で、あなたはsuper(a、b)と書いています。 super(a、b)は実際にPerson(a、b)を呼び出しています。したがって、bとBBは、親クラスのデータメンバの値として格納されています。まず、親に割り当てた値a、AAを上書きします。 –

2

継承はあなたの考え方では機能しません。メソッドと変数はコピーされますが、値はコピーされません。

新しいPerson()を作成してそれを作成し、新しいStudent()を作成すると、Personの値はコピーされません。これは値が通常Classes以外のクラスのインスタンスに基づいているためです。これをコピーする方法がありますが、間違って変数を静的にする以外は通常は行われません。

静的変数はそのクラス

のすべてのインスタンスで、クラスではなくインスタンスに関連付けられているので、共有されているお問い合わせの際、スーパー()あなたが子供の値を持つ親のメソッドを呼び出しています、もしあなたが2つのメソッドをオーバーロードされていれば1つしかなく、そうでなければ親メソッドを呼び出すことができます。例えば、以前に定義されたpersonクラスを変更しないことに注意してください。

class Person{ 
    public Person(String name) { 
     this.name = name; 
    } 
} 

class Student extends Person{ 
    public Student(String name, int grade){ 
     super(name); 
     this.grade = grade; 
    } 
} 

スタティックアイデアの場合、すべてのインスタンスで変数を共有できます。すなわち

class Person{ 
    static String School = "Wandsworth Primary"; 
     public Person(String name) { 
      this.name = name; 
     } 
    } 

    class Student extends Person{ 
     public Student(String name, int grade){ 
      super(name); 
      this.grade = grade; 
     } 

     public show() { 
      System.out.println(school); 
     } 
    } 
+0

私のコードには、子クラスのコンストラクタから親のコンストラクタを呼び出し、親のコピーをSUPERキーワードで取得する方法がありますか? – inhaler

+1

いいえ、別のインスタンスとして。 Parent変数をstatic宣言しない限り、すべてのインスタンスは同じコピーを持ちます。私は答えに例を追加 –

1

これは継承とは関係ありません。あなたはちょうどクラスの概念を理解していません。

作成したpとは完全に独立したものです。それらは互いに影響を及ぼさないので、s.show()を呼び出すと、pの値は決して印刷されません。

"でもspから継承されています!だから、pのコピーが必要です!"あなたは主張した。いいえ、spから継承されず、StudentのみがPersonから継承されます。

sにはpのコピーがありますが、StudentのコピーはPersonです。

Studentには、showメソッドはありませんが、それでも呼び出すことはできます。どうして? StudentPersonから継承されているので、showメソッドはStudentに「コピー」されます。あなたがショーを呼び出すと

、どのような実際に起こることはPersonshowが呼び出されるということです。

System.out.println(this.name + "\n" + this.id); 

あなたが見ることができるように、それは、発信者の(私たちは、それが理由thisキーワード、呼び出し元の知っている)の名前を出力し、 id。誰がここにいるの? s!それが、学生の名前とIDを印刷する理由です。あなたはまだ理解していない場合は、ちょうどこのようStudent

を考える:

class Student { 
    public String name; 
    String id; 

    void show() { 
     System.out.println(this.name + "\n" + this.id); 
    }  


    Student() {} 

    Student(String a, String b) { 
     System.out.println("Parent parameter"); 
     this.name = name; 
     this.id = id; 
    } 
} 

参照してください?私はPersonクラスのすべてのものをStudentにコピーしました!

+0

私はそれを得る、あなたに感謝@スウィーパー – inhaler

関連する問題