2016-11-13 9 views
0

私はJavaのoopを学びたいと思っています。私はいくつかの例を作るときにスーパーメソッドの使い方を理解するいくつかの問題を見つけます。以下のコードを試してください。Javaでsuper()を使用しますか?

あなたは私になぜsuper();メソッドはsuperClassを参照していませんか?わかりません 。

スーパークラス:

package javaapplication; 

public class A { 

    protected String val; 

    public A(){ 

     this.val = " Class A "; 
    } 
} 

サブクラス

package javaapplication; 


public class B extends A { 


    public B(){ 

     this.val = " Class B"; 
     System.out.println(super.val); 


    } 
} 

メインクラス

package javaapplication; 

public class JavaApplication { 

    public static void main(String[] args) { 

     B a = new B(); 


    } 

} 

出力:実行:クラスB

を私は "クラスB" を得た理由は?

+1

を印刷しますだけでコンストラクタBからthis.val = Class BをコメントアウトClass B

として再び値を設定this.val = Class Bをやっていますか?あなたは何を期待しましたか? 'val'は両方のクラスで同じことです。 – Li357

+0

出力として何を期待しましたか? –

+0

[super()をいつ使用するのですか?](http://stackoverflow.com/questions/4090834/when-do-i-use-super) –

答えて

7

val変数が1つのみで、Bコンストラクタが "クラスB"に設定されているためです。

あなたは代わりに現在のクラスのスーパークラスにsomething(メンバ変数やメソッド)を参照するためにsuper.somethingを使用することができますが、両方のクラスがsomethingを宣言した場合、それらは異なるだけになります。この場合、ABの両方がAで定義されたvalを共有しています。

1

Javaのコンストラクタ(現在はBクラスのコンストラクタに焦点を当てています)明示的に指示すると、this(arguments...)またはスーパークラスAのコンストラクタで明示的に指示すると、常にクラスBの別のコンストラクタが呼び出されますsuper(arguments...)で行うか、別のコンストラクタへの呼び出しを指定しない場合はsuper()を呼び出します。そして、この呼び出しは、任意のコンストラクタの最初の命令です。あなたが話しているクラスがObjectでない限り。

最初にAコンストラクタが呼び出され、valが "Class A"に設定されますが、その後、クラスBのコンストラクタはその値を継続的に消去し、 "Class B"に置き換えます。

コンストラクタがどのように動作するかについての良い例ですが、本質的にはプログラミングが悪いので、これはあなたのやり方ではありません。良いプログラマは、クラスAのコンストラクタをvalの値を受け取り、クラスBの場合はsuper( "Class B")を使用して呼び出すことになり、valはクラスAで定義されるプライベート変数になります。

クラスBはクラスAを拡張し、クラスBのインスタンスはクラスBとクラスAで定義された属性を持つため、super.valまたはthis.valはまったく同じ変数を参照しています。クラスBに新しい変数valを追加することはできますが、コンパイラがこれを受け入れるならば、これは悪いプログラミングになります。わかりません。

1

B a = new B(); Bのコンストラクタが実行され、内部で基本クラスコンストラクタが最初の操作として呼び出されます。このため、変数valの値がClass Aに設定されます。しかし、その後、あなたは手動で 'B'のコンストラクタで `クラスB`に割り当てているので、それはClass A

関連する問題