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

好吧,为了避免在你提到 name=name 这样的情况下发生混淆,我们使用这个指针来明确我们这里的意思是类变量名。

因此,在这种情况下,为了让读者理解,我们使用它,尽管在许多其他情况下 (this) 更有用。

在某些编译器中 name=name 也会出错

于 2012-10-03T09:50:30.293 回答
1

请注意,name您的代码中调用了两件事。您的类Employee有一个名为 的成员变量name,并且构造函数接受一个也称为 的参数name

您想要在构造函数中将成员变量设置name为与参数相同的值name。要访问成员变量,必须使用this.name, 因为name指的是参数 - 因为变量具有相同的名称,所以参数隐藏了成员变量。

请注意,name = name;它与this.name = name;.

当您这样做时name = name;,您将参数的值分配给name参数本身 -而不是成员变量。编译器并不神奇地知道第一个name应该表示成员变量,第二个name应该表示参数。

因此,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 回答