2017-03-19 6 views
0

私は、インスタンスデータとして扱う変数と、仮パラメータとして扱う変数をJavaがどのように決定するか(私がJavaを個性化しているように聞こえると言い訳します)を理解しようとしています。私はこの混乱が適切なコーディングテクニックの後に避けることができることを知っていますが、私はそれの背後にあるロジックについては興味があります。次の例では:仮パラメータまたはインスタンスデータがあるかどうかJavaがどのように検出しますか?

public Foo{ 
    int a, b, c; 

    //this assigns the formal parameters' values to the instance data's values 
    public Foo(int x, int y, int c){ 
     a = x; //makes sense 
     this.b = y; //makes sense 
     c = c; //how? 
    } 

    //how can you tell which value is being dealt with 
    public int getBar(int a, int b, int c){ 
     if(b < (b - b)) 
      a += 5; 
     else 
      a += a; 
     b = b; 
     b += c; 
     return b; 
    } 
} 

コンストラクタ、Foo()、仮パラメータは、すべてのインスタンスのデータにコピーされています。これは最初の2つの課題ではっきりしていますが、3番目の課題ではいくつか質問があります。 Javaはどのような "c"を使用するかをどのように知っていますか?インスタンスデータを格納するものか、仮パラメータを表すものか? 2番目の関数(あまりにも極端な例であれば申し訳ありません)では、Javaがインスタンスデータを表す変数と仮引数を表す変数をJavaがどのように決定するのか、どのように知っていますか。

+2

ルールは単純です。パラメータとフィールド(インスタンスデータと呼んでいるもの)が同じ名前を持つ場合、その名前の前に 'this 'が付いていない限り、その名前の使用は**パラメータ**を参照します。 –

+1

'c = c'はインスタンス変数に代入されません。 – user2357112

答えて

2

基本的に、パラメータとローカル変数はフィールドに優先します。これはshadowing of the variable or nameと呼ばれます。だからc=cはあなたのコードに何もしません。 cの値を自身に割り当てます。

+0

うわー。それは本当に簡単な答えでした。本当にありがとう。できるだけ早く受け入れる(8分放置)。 –

+0

@SotiriosDelimanolis Sheesh、私は記憶喪失を起こしているに違いない。修正しました。 –

0

このキーワードは、インスタンス変数を参照するJavaに指示します。ほとんどの場合、これはオプションです。問題は、同じ名前の変数が2つあることがあることです。コンストラクタでは、1つはパラメータであり、1つはインスタンス変数です。そうでなければ、Javaはパラメータである最も細かいスコープのものを提供します。

関連する問題