2016-06-14 4 views
1

私は2つのクラスを持っています。どちらもコンストラクタ内の同じ変数を参照します。私が混乱している、私が使用したときthis.name私はパラメータの名前を変更する必要はありません、Javaコンパイラは私が主な変数を参照していることを知っている?この相違点を使用するコンストラクタパラメータ?

第2のクラスの例では、パラメータ名は変更されましたが、thisは使用されていません。 これら2つのクラスの違いは何ですか? 彼らはどちらも「良いプログラミング」と見なされていますか?

class Account { 
    private string name; 
    private int amount; 

    Account(String name, int amount) { 
     this.name = name; 
     this.amount = amount; 
    } 
    } 

class Account { 
private string name; 
private int amount; 

Account(String n, int a) { 
    name = n; 
    amount = a; 
} 
} 
+0

第2の場合の 'this'は暗黙的に追加されます – Ramanlfc

答えて

1

Javaでは、インスタンス変数とローカル変数/パラメータに同じ名前を使用できます。

メソッド/コンストラクタのパラメータ名がインスタンス変数名と同じ場合、明示的にthisキーワードを使用して、このインスタンス変数を使用しようとしていることをJVMに通知する必要があります。ローカル変数ではありません。それ以外の場合は、thisのない同じ名前の変数に対して、より具体的なスコープ変数がJVMによって選択されます。

最初のケースではあなたがそうあなたが明示的に怒鳴るthisを使用して、インスタンス変数である1定義する必要がありnameと呼ばれるパラメータと、インスタンス変数に同じ変数名を使用している:

this.name = name; 

後者の場合には、そこにあります名前の混乱がないので、thisを使用しない場合は、インスタンス変数を識別するための問題はありません。

N.B. インスタンス変数にアクセスするときには、可読性のためにthisを使用する方が良いです。

1

どちらの罰金です。プライベートインスタンス変数をnameとも呼ぶ場合は、this.nameだけを使用します。取り込まれたパラメータとは異なる名前のインスタンス変数がある場合は問題になりません。

2

この場合、Account(String name, int amount)コードにname = "ABC";と表示されている場合、メンバーではなくパラメータnameが設定されています。メンバーを設定する場合は、this.nameで参照する必要があります。

したがってname = name;は何もしません(パラメータを自分自身に設定します)。 this.name = name;はメンバをパラメータに設定します。

2

どちらのコードも間違っていません。しかし、Javaでは、インスタンス変数とローカル変数のパラメータを区別するために無意味な名前接頭辞または接尾辞を使用することは貧弱です。どのような名前であれ、コードを理解しやすいものにすることをお勧めしたいと思います。

1

この2つのクラスの違いは何ですか?

機能的にはありません。次のようにコンパイラはあなたの第二の例を変更します:

Account(String n, int a) 
{ 
    this.name = n; 
    this.amount = a; 
} 

を両方の方法は、「良いプログラミング」を検討していますか?

私はコードを書くのが第1の方法です。