2016-09-16 8 views
1

私はjavaを初めて使用しています。最近、私はこれに似たいくつかのコードを見た:サブクラスのインスタンスを作成するときに継承されたメンバーにアクセスする際の "this"と "super"の相違点

class A { 
    protected int myInt; 

    public static void main(String[] args) { 
     B b = new B(); 
     b.myFunction(); 
    } 
} 

class B extends A { 
    public void myFunction() { 
     this.myInt = 10; 
    } 
} 

私の知る限りでは、その親のインスタンスが同様に作成されます。基本クラスのすべての保護されたメンバーとパブリックメンバーは、サブクラスからアクセスできます。 myIntを無効にすると、this.myIntsuper.myIntの間に違いがあります。それぞれのクラスには独自のmyInt(Bは両方にアクセス権があるため)があるためです。

私の質問は、myIntを上書きしないと、どの形式が好ましいかthis.myIntまたはsuper.myInt

+0

フィールドをオーバーライドしません。また、 'B'も' A'ですが、インスタンスは2つではなく1つだけ作成されます。 –

+2

可能な複製http://stackoverflow.com/questions/4023344/difference-between-this-andsuper-keywords-in-java –

+0

@ElliottFrischによるコメントの明確化: 'B'に' myInt'も宣言すれば、 *フィールドをオーバーライドしない*あなたは 'A 'に同じ名前のフィールドを隠しています。 [Java™チュートリアル - フィールドの非表示](https://docs.oracle.com/javase/tutorial/java/IandI/hidevariables.html)を参照してください。 – Andreas

答えて

1

これは味の問題であり、プロジェクトの基準/ガイドラインは他の何よりも重要です。

個人的には、どちらも使用せず、myInt = 10と書くだけです。

+1

2つ目のパラグラフをあなたの*意見*としていただきありがとうございます。 +1 – Andreas

2

使用している/参照している範囲を指定する必要がある場合は、thisまたはsuperを使用する必要があります。あなたの場合は、わかりやすくするためにthisを省略したいと思います。

は親クラスの現在のインスタンスを表し、thisは現在のクラスを表すのに使用されます。いくつかの変数またはメソッドが広い範囲で重複している(同じ名前を持つ)場合は、thisまたはsuperを使用する必要があります。

例えば、 class属性と同じ名前のメソッド・パラメータを定義している場合は、これを使用して、method属性ではなくclass属性を使用していることを示す必要があります。

public class A { 

    public int myInt = 1; 

    public static void main(String[] args) { 
     B b = new B(); 
     b.myFunction(3); 
    } 
} 

class B extends A { 

    public int myInt = 2; 

    public void myFunction(int myInt){ 

     System.out.println(myInt); // The parameter 
     System.out.println(this.myInt); // myInt from the current class (B) 
     System.out.println(super.myInt); // myInt from the parent class (A) 
    } 
} 

この例では、印刷されます:

3 
2 
1 

あなたはcollissionのこの種を持っていない場合は、これの使用はオプションです:

public void myFunction2(){ 
    System.out.println(myInt);  // Both refers to the same 
    System.out.println(this.myInt); // variable myInt from class B 
} 
+1

*意見:*この場合、私は 'super 'を使うことを好むでしょう。継承されたフィールドが参照されていることを文書化します。同様に、変数/パラメータではなく、フィールドが参照されていることを文書化するために、継承されていないフィールドで 'this.'を使用することを好みます。それは、私が "シンプル"で、あまり明確なコードよりも優れている、カジュアルリーダーのコードを明確にするコードスタイルの決定です。 – Andreas

0

1つのインスタンスのみが作成されます。派生オブジェクトをインスタンス化すると、親コンストラクタが呼び出されますが、1つのオブジェクトのみが作成されます。また、thisという用語は、同じ名前がクラス内で参照されている変数が異なる場合に使用されます。例えば シンプルコンストラクタ:あなたは明示的にスーパークラスにある値を使用したいとき

class SupClass{ 
    public int a = 1; 
    int incA(){ 
     return ++a; 
    } 
} 
class MyClass extends SupClass { 
    public int a = 10; 
    public int b = 20; 
    MyClass() {}; 
    MyClass(int a, int b){ 
     this.a = a; 
     this.b = b; 
    } 

    int incA(){ 
     return ++a; 
    } 
    public static void main(String args[]) 
    { 
     SupClass d = new MyClass(); 
     System.out.println(d.a); //1, members known of type SupClass at compile-time, 
     System.out.println(d.incA()); //11, methods are virtual, decided at run-time 
    } 
} 

のみsuperメソッドを使用します。あなたの質問に答えるには、メソッドだけを上書きすることができます。メンバ変数はできません。

関連する問題