Java 用这个。在爪哇

Java 用这个。在爪哇,java,this,Java,This,我知道这两个代码块都可以工作,但当我试图理解“this”的用法时,如果您能解释一下为什么Vehicle1类比Vehicle2类“更好”,我将非常感激。 提前多谢 public class Vehicle1 { private String color; Vehicle(String c) { this.setVehicle(c); } Vehicle() { this.setVehicle("Red");; } public void setVehicl

我知道这两个代码块都可以工作,但当我试图理解“this”的用法时,如果您能解释一下为什么Vehicle1类比Vehicle2类“更好”,我将非常感激。 提前多谢

public class Vehicle1 {
  private String color;

  Vehicle(String c) {
    this.setVehicle(c);
  }
  Vehicle() {
    this.setVehicle("Red");;
  }
  public void setVehicle(String c) {
      this.color = c;
  }
  public String getVehicle() {
      return color;
  }
}


public class Vehicle2 {
  private String color;

  Vehicle(String c) {
    color = c;
  }
  Vehicle() {
    color = "Red";
  }
  public String getVehicle() {
      return color;
  }
}

车辆1更好,因为它消除了任何歧义或混淆。在vehicle 2中,如果方法中有另一个“color”变量,那么您将处理该局部变量,而不是汽车本身的颜色。

这主要是一个偏好问题,但使用
的一个优点是它避免了与更多局部变量的命名冲突。例如,如果您想让调用构造函数的人知道它的参数应该是颜色,您可能希望将其命名为:

  Vehicle(String color) {
    color = color;        // This doesn't set the field.
  }
上面的代码显示,在不使用
this
的情况下,字段名
color
现在被本地参数名篡夺。根据您的设置,您可能会收到一些编译器警告,但可能会忽略该错误

如果您使用
此。
,则一切都将继续工作,无需进行任何其他更改:

  Vehicle(String color) {
    this.color = color;
  }

如果局部变量或方法参数可能会隐藏类属性,我们将使用
。 它指出这个特定的引用将在类属性中找到

例如:

当方法/本地属性与实例属性相同时,可以看到主要区别:

此代码完全按照我们的预期执行,将值指定给
color
属性:

public void setVehicle(String c) {
   this.color = c;
}
所以在这里
这个
是不必要的,因为方法参数名称不影响属性
颜色

但如果我们使用与属性名相同的参数名:

public void setVehicle(String color) {
   color = color;
}
然后,它将意味着将方法参数
color
分配给它自己,这没有意义


因此,如果我们想设置一个新的属性值,我们需要使用
this
,以便告诉编译器
color
是一个实例属性,而不是局部变量。

第二个版本实际上更好。但这与
这个
的使用无关。构造函数不应该调用可重写的方法。为什么要命名setVehicle()/getVehicle()方法来设置和获取颜色。为什么不设置setColor()/getColor()?
这是当前对象的引用。您可以使用
this
对最终变量(您不能分配它)执行所有您可以执行的操作,并且(作为构造函数中的第一个语句)调用另一个构造函数。
这。
作为方法前缀是完全没有用的。你的构造器没有链式。您已将分号加倍。第一个示例从构造函数调用可重写的方法。构造函数不是公共的。这两个例子都是废话。这个答案是错误的。在第一个例子中没有歧义,所以不能减少。模糊度不能小于零。