2012-03-11 4 views
5

thisキーワードをAndroidのメソッド名とともに使用して、同じクラス内の別のメソッドからメソッドを呼び出すのはなぜですか? JavaまたはC#では、以下のコードのように、thisキーワードなしで直接他のメソッドを呼び出すことができます。androidのこのキーワード

public final String getElementValue(Node elem) 
{ 
    Node child; 
    if(elem != null) 
    { 
     if (elem.hasChildNodes()) 
     { 
      for(child = elem.getFirstChild(); child != null; child = child.getNextSibling()) 
      { 
       if(child.getNodeType() == Node.TEXT_NODE ) 
       { 
        return child.getNodeValue(); 
       } 
      } 
     } 
    } 
    return ""; 
} 

/** 
    * Getting node value 
    * @param Element node 
    * @param key string 
    * */ 
public String getValue(Element item, String str) 
{  
    NodeList n = item.getElementsByTagName(str);  
    return this.getElementValue(n.item(0)); 
} 

答えて

6

「この」要件に関する疑問は正しくありません。 これはjavaと同じです - あなたは "this"キーワードを追加する必要はありません。

ただし、同じ名前の複数の関数があり、スコープが異なる場合(静的関数と通常関数など)に使用することをお勧めします。

また、フィールドに接頭辞( "m"や "_"など)がない場合は、「this」を使用することをお勧めします。そのような場合には、自動的に "this"キーワードを追加するようにeclipseを設定することもできます。

+0

ステートメントではどういう意味ですか? "また、フィールドに接頭辞(" m "や" _ "など)がない場合は、" this "を使用することをお勧めします。そのような場合に自動的に "this"キーワードを追加します。 " –

+0

通常の変数(内部関数)とオブジェクトのクラスのものを区別できるようにすることをお勧めします。 –

8

あなたはに、この場合にthisキーワードを使用し、それは暗黙的にとにかく行われていません。時にはそれがより明確になり、時にはEclipseがメソッド名を自動完成させることもあります:P

+0

「Sometim Eclipseが自動的にメソッド名を完成させるようにします。 –

+0

少なくとも私のコンピュータでは、eclipseはメソッドと変数の名前を前もって指定していれば自動的に完了しますので、正確なメソッド名を覚えていないと 'this.'と書いて完全なメソッド名を取得します。より明確に言えば、それは本当に味とスタイルの問題です。 – MByD

2

return getElementValue(n.item(0));と書くだけで問題ありません。一般的には、thisは、コンストラクタのパラメータは、属性と同じ名前を持っている場合例えば、曖昧さを払拭するために使用されている:あなたが呼び出しているあなたのコード例では

private int number; 
public Example(int number) { 
    this.number = number; // here `this` is mandatory 
} 
1

を、あなたはあなたの方法として、キーワードthisをスキップすることです同じクラスに。ただし、というキーワードを使用するのは、同じクラスのオブジェクトをそのクラスの中に入れて参照するためです。

のJavaドキュメントごとのとおり

インスタンスメソッドやコンストラクタ内で、これは 現在のオブジェクトへの参照である - そのメソッドやコンストラクタ が呼び出されているオブジェクト。これを使用して、 のインスタンスメソッドまたはコンストラクタ内の現在のオブジェクトの任意のメンバを参照できます。

7

私はあなたの答えを得ることを望みますが、私はこの質問を探している人に余分な理解を提供するためにここに投稿します。

thisキーワードは、現在のアクティビティまたはクラスまたはオブジェクトを表します。

public class ClassChaosActivity extends Activity { 

    public static final String DEBUG_TAG = "MyLoggingTag"; 
    /** Called when the activity is first created. */ 
    @Override 
    public void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 
     setContentView(R.layout.main); 

     final TextView myTextview = (TextView) findViewById(R.id.TextViewToShow); 
     Button myButton = (Button) findViewById(R.id.ButtonToClick); 
     myButton.setOnClickListener(new View.OnClickListener() { 
      public void onClick(View v) { 

       SimpleDateFormat formatter = new SimpleDateFormat("h:mm:ss a"); 
       String strWhen = formatter.format(new Date()); 
       myTextview.setText("Clicked at " + strWhen); 

       Log.v(DEBUG_TAG, "this Class name: " + this.getClass().getName()); 
       Log.v(DEBUG_TAG, "this extends interface named: " + this.getClass().getInterfaces()[0].getName()); 
       Log.v(DEBUG_TAG, "this Enclosing class name: " +this.getClass().getEnclosingClass().getName()); 
       Log.v(DEBUG_TAG, "this Is anonymous class? " + this.getClass().isAnonymousClass()); 

       Log.v(DEBUG_TAG, "ClassChaosActivity.this Class name: " + ClassChaosActivity.this.getClass().getName()); 
       Log.v(DEBUG_TAG, "ClassChaosActivity.this Super Class name: " + ClassChaosActivity.this.getClass().getSuperclass().getName()); 
       Log.v(DEBUG_TAG, "ClassChaosActivity.this Is anonymous class? " + ClassChaosActivity.this.getClass().isAnonymousClass()); 
      } 
     }); 
    } 
} 

ログファイルがあり、ここで

private int number; 

public example(int number) { 
    this.number = number; 
} 

this.numberprivate int number変数を表し、番号はメソッドint number

は、今、私たちは現在のクラスを表すために内部クラスにとして「この」キーワードを使用することができますです::

10-24 18:18:53.075: VERBOSE/MyLoggingTag(751): this Class name: com.androidbook.classchaos.ClassChaosActivity$1 
10-24 18:18:53.085: VERBOSE/MyLoggingTag(751): this extends interface named: android.view.View$OnClickListener 
10-24 18:18:53.085: VERBOSE/MyLoggingTag(751): this Enclosing class name: com.androidbook.classchaos.ClassChaosActivity 
10-24 18:18:53.095: VERBOSE/MyLoggingTag(751): this Is anonymous class? true 
10-24 18:18:53.095: VERBOSE/MyLoggingTag(751): ClassChaosActivity.this Class name: com.androidbook.classchaos.ClassChaosActivity 
10-24 18:18:53.105: VERBOSE/MyLoggingTag(751): ClassChaosActivity.this Super Class name: android.app.Activity 
10-24 18:18:53.105: VERBOSE/MyLoggingTag(751): ClassChaosActivity.this Is anonymous class? false 
関連する問題