1

私はJavaの初心者で、ゆっくりとこの言語の感触をつかみ始めました。

「この」変数を理解するのに苦労しています。

たとえば、どちらが優れているか..そしてその理由は?

  public class Foo{
   int a;
   public Foo(int _a){
   a = _a;
     }
 }

public class Foo{
   int a;
   public Foo(int _a){
   this.a = _a;
     }
 }

ありがとう

4

5 に答える 5

8

個人的には、変数を区別するためにアンダースコアまたは "m_" を使用する規則は嫌いです。これは、IDE が明確にすることを意図したものです。

this現在のインスタンスに属する変数を明確に表すために使用します。

どちらの例にも利点はありません。生成されたバイトコードを見ることで、それを証明できます。javap を使用すると、2 つが同じコードにコンパイルされることがわかります。

私の意見では、それはあなた自身や他のプログラマーにとって読みやすさと関係があります。また、IntelliJ などの優れた IDE は、強調表示と色分けを使用してさらに明確にしています。

絶対に必要な 1 つの状況は、メソッド パラメーターとプライベート メンバーの間に名前の衝突がある場合です。次に、thisどちらがコンパイラ用かを明確にするために使用する必要があります。

public class Foo {
    private int x;
    public void setX(int x) {
        this.x = x;  // this is required here.
    }
}
于 2012-09-25T02:38:40.133 に答える
4

言語に関する限り、どちらも「優れている」わけではなく、まったく同等です。

ただし、2 番目のオプションを好む十分な理由があります。これは、コードが実行内容をより明確に示しているためです。

于 2012-09-25T02:36:45.080 に答える
3

どちらが良いかは主観的なものです。参照しているものが現在のオブジェクトに属していることが明確になるため、明示的な命名を好みthis.aます (私の変数はそれよりも少し説明的ですが)。

それ以外の場合は、確認のために他の場所を探す必要があります。たとえば、この時点から関数の開始までの任意の場所に作成されたローカル変数である可能性があります。

于 2012-09-25T02:37:50.127 に答える
2

この場合、それらは同一のバイトコードを生成するため、どちらを選択するかはスタイルの問題です。一般に、this(これは厳密には変数ではありません) は、現在指定されているクラス、またはより一般的には、そのインスタンスの 1 つ (現在指定されているメソッドが呼び出されたもの) を指します。

于 2012-09-25T02:42:12.320 に答える
2

上記のコードから、違いはありません。ただし、Java のスコーピングとシャドウイングのメカニズムにより、これが必要になる場合があります。たとえば、

public class Foo{
   int a;
   public Foo(int _a){
       this.a = _a;
   }
 }

不要です、これは

public class Foo{
   int a;
   public Foo(int a){
       this.a = a;
   }
 }

aこれは、 のような単純な変数名の代わりに、より複雑なものがある場合に便利です。

これは、一部の C++ 型がこれを呼び出していた場合、奇妙な現象である可能性があります-> 実際には、変数のルックアップ方法とは何かが異なることを行います。ただし、Java はこれらすべての詳細を回避します。

于 2012-09-25T02:40:01.610 に答える