1

this次のコードについて質問があります。以下、this.name 名前を設定します。を使用してこれを行うこともできるname = nameので、私の質問はthisポインターを使用する必要があるかどうかです。これは宿題ではありません

import java.io.*;

public class Employee{
    String name;
    int age;
    String designation;
    double salary;

    //This is the constructor of the class Employee
    public Employee(final String name){ //EDIT: Made parameter final
        this.name = name;
        //name= name; this is also correct
    }

    //Assign the age of the Employee  to the variable age.
    public void empAge(int empAge){
        age =  empAge;
    }

    //Assign the designation to the variable designation.
    public void empDesignation(String empDesig){
        designation = empDesig;
    }

    //Assign the salary to the variable salary.
    public void empSalary(double empSalary){
        salary = empSalary;
    }

    //Print the Employee details
    public void printEmployee(){
        System.out.println("Name:"+ name );
        System.out.println("Age:" + age );
        System.out.println("Designation:" + designation );
        System.out.println("Salary:" + salary);
    }
}
4

7 に答える 7

9
  //      name= name; this is also correct

これは正しくありません。パラメータをそれ自体に割り当てます。thisキーワードを使用することで、使用している名前 (つまり、オブジェクトのフィールド)を宣言しています。Employee

パラメータとは異なる名前をフィールドに付けることができます。ただし、これは、誰かがコードを自動的にリファクタリングして (おそらく不注意で) フィールドとパラメーターを同じ名前として宣言するまで、すべてがうまく機能することを意味します!

このため、次のように定義されたメソッド シグネチャがよく見られます。

public Employee(final String name)

このfinalキーワードは再割り当てを防ぎ、誤って入力パラメーターを再割り当てして、その結果、フィールドに割り当てられないようにします。また、フィールドを として宣言した場合final、そのフィールドに割り当てを行わないとコンパイルが失敗することにも注意してください。を使用することは、このようなエラーをトラップし、オブジェクトの不変性finalを強制するための良い方法です(多くの場合、良いことです。特にスレッド化された環境では、より信頼性の高いソリューションに貢献します)。

于 2012-10-03T09:50:12.400 に答える
1

u が name=name に言及したような場合の混乱を避けるために、このポインターを使用して、ここではクラス変数 name を意味することを明確にします。

したがって、この場合、読者に理解してもらうためにこれを使用しますが、(これ) がより役立つ他の多くのケースが考えられます。

一部のコンパイラでは name=name もエラーになります

于 2012-10-03T09:50:30.293 に答える
1

nameコードで2 つのことが呼び出されていることに注意してください。クラスEmployeeには というメンバー変数がnameあり、コンストラクターは とも呼ばれるパラメーターを受け取りますname

コンストラクターでやりたいことは、メンバー変数nameをパラメーターと同じ値に設定することnameです。メンバー変数にアクセスするには、パラメーターを参照するthis.nameため、を使用する必要があります。name変数は同じ名前であるため、パラメーターはメンバー変数を隠しています。

name = name;は と同じことをしないことに注意してくださいthis.name = name;

を行うときは、パラメーターの値をメンバー変数ではなく、パラメーター自体にname = name;割り当てます。コンパイラは、最初の変数がメンバー変数を意味し、2 番目の変数がパラメーターを意味することを魔法のように認識していません。namenamename

したがって、thisこの場合、メンバー変数を隠しているパラメーターではなく、メンバー変数を明示的に参照する必要があります。

于 2012-10-03T09:51:37.697 に答える
1

この場合thisは、スコープの解決/明確化にすぎません。

public Employee(String name){
  this.name = name;
  // the above line will assign a value of parameter to instance variable
  //      name= name; this is also correct
  // (**NO** the above line will assign a value of parameter to itself) 
}
于 2012-10-03T09:52:46.473 に答える
1

パラメータ名とクラス変数名が同じ場合、それらthis.classVariableを区別するために、クラス変数を識別するために書き込みます

于 2012-10-03T09:53:22.463 に答える
1

変数を呼び出すとき、指し示すものは現在のスコープに最も近いものです。

そのため、プログラムが現在メモリ内にローカル変数totoとフィールド変数を含むラッピング クラスを含んでいる場合、フィールドの変数にアクセスするtotoには正確なthisキーワードを指定する必要があります。

それ以外の場合、フィールド変数はローカル変数によってシャドウされていると言われるためtoto = toto、ローカルパラメーターがそれ自体に割り当てられ (決して役に立たない)、期待されているものではなく、フィールド変数に割り当てられます。

于 2012-10-03T09:53:29.660 に答える
0

なぜ自分自身にそれを難し​​くするのですか?

署名/メソッドを次のように書き換えるだけです。

public Employee(String _name) {
   name = _name;
}

変数の隠蔽やその他の読みにくい構造は常に避けるようにしてください。コードを保守可能にしたい場合は、誰もがすぐに理解できるように記述してください。あなただけだとしても。時間の経過とともに意味を忘れる可能性があります。

于 2012-10-03T09:53:26.083 に答える