Java - 何时使用“this”关键字[重复]

IT小君   2021-09-20T08:20:28

this在 Java 中使用关键字的最佳实践是什么例如,我有以下课程:

class Foo {
    Bar bar;

    public Foo(Bar bar) {
         this.bar = bar;
    }
}

这很好,但 Java 足够聪明,知道如果我将构造函数中的语句更改为

 bar = bar;

那么为什么要使用this关键字呢?(我意识到在某些情况下,完全有必要使用它,我只是要求这样的情况)。实际上,我倾向于纯粹为了可读性而使用关键字,但通常的做法是什么?例如,在整个商店使用它会使我的代码看起来有点混乱

boolean baz;
int someIndex = 5;
this.baz = this.bar.getSomeNumber() == this.someBarArray[this.someIndex].getSomeNumber();

显然代码很差,但它说明了我的示例。在这些情况下,是否仅取决于个人喜好?

评论(12)
IT小君

但是 Java 足够聪明,知道如果我将构造函数中的语句更改为

  bar = bar;

错误的!它编译但它没有做你认为它做的事情!

至于何时使用它,很多都是个人喜好。我喜欢this在我的公共方法中使用,即使它是不必要的,因为那是接口发生的地方,并且很好地断言什么是我的,什么不是。

作为参考,您可以查看 Oracle 的 Java 教程关于 this.subject ;-)

http://docs.oracle.com/javase/tutorial/java/javaOO/thiskey.html

2021-09-20T08:20:28   回复
IT小君

当您有一个与字段同名的参数时,您应该使用它,否则您会遇到问题。它会编译,但不一定会按照您的意愿行事。

至于其他地方,除非为了可读性需要,否则不要使用它。如果在任何地方都使用它,那么 20% 的代码将包含“this”这个词!

2021-09-20T08:20:28   回复
IT小君

this关键字是指调用某些方法的类的对象。
例如:

public class Xyz {  
    public Xyz(Abc ob)
    {
        ob.show();
    }
}

public class Abc {
    int a = 10;

    public Abc()
    {
        new Xyz(this);
    }

    public void show()
    {
        System.out.println("Value of a " + a);
    }

    public static void main(String s[])
    {
        new Abc();
    }
}

在这里,Abc()我们正在调用Xyz()需要 Abc 类的对象..所以我们可以传递this而不是 new Abc(),因为如果我们Abc()在这里传递 new它将一次又一次地调用自己。

我们也用它来区分类的变量和方法的局部变量。例如

class Abc {
    int a;

    void setValue(int a)
    {
        this.a = a;
    }
}

这里this.a是指类 Abc 的变量 a。因此与您使用 new 具有相同的效果Abc().a;

所以你可以说this是指当前类的对象。

2021-09-20T08:20:29   回复
IT小君

实际上

baz = baz

将引发此警告

对变量 baz 的赋值无效

所以你认为是错误的,局部作用域覆盖了 class 属性,所以你必须使用this关键字显式地将变量分配给 class 属性。

否则,赋值的变量只是作为参数传递的变量,而忽略类 1。这就是为什么this有用,这不是可读性的事实,而是明确决定baz您在谈论哪个的事实

我会说

使用this的地方不使用会引起歧义(或编译器警告,这是更重要的),否则见好就收吧。因为它的目的正是在默认假设(首先检查局部变量,然后检查类属性)不够时解决歧义。

2021-09-20T08:20:29   回复
IT小君

显式构造函数调用中使用this关键字是很常见的您可以从文档中看到一个示例

public class Rectangle {
    private int x, y;
    private int width, height;

    public Rectangle() {
        this(0, 0, 1, 1);
    }
    public Rectangle(int width, int height) {
        this(0, 0, width, height);
    }
    public Rectangle(int x, int y, int width, int height) {
        this.x = x;
        this.y = y;
        this.width = width;
        this.height = height;
    }
    ...
}
2021-09-20T08:20:29   回复
IT小君
public Foo(Bar bar) {
     this.bar = bar;
}

不一样

public Foo(Bar bar) {
     bar = bar;
}

在第二种情况下,范围内的栏是参数,因此您将其分配给自身。this.bar仍然null

2021-09-20T08:20:29   回复
IT小君

这是个人喜好——选择一种风格并坚持下去。我个人使用,this但其他人认为它是多余的。

2021-09-20T08:20:30   回复
IT小君

根据约定,您可以使用它来提高可读性。它强调了它是一个对象变量的事实。

我也喜欢使用与变量同名的 setter 参数(在方法签名中看起来更好)。this在这种情况下你需要

2021-09-20T08:20:30   回复
IT小君

我总是尝试this在本地类对象上使用关键字。

我用它来直观地提醒我一个对象是静态对象还是类对象。

它帮助我和编译器区分方法参数和本地类对象。

public void setValue(int value){
  this.value = value;
}

它帮助我直观地提醒我内部/嵌套/匿名类中是否存在这样的本地对象,以将其与封装类对象区分开来。因为如果没有this前缀,我的约定会提醒我它是封装类的对象

public class Hello{
  public int value = 0;
  public boolean modal = false;

  public class Hellee{
    public int value = 1;
    public getValue(){
      if (modal)
        return 0;
      return this.value;
    }
  }
}
2021-09-20T08:20:30   回复
IT小君
void set(int real)
{
    this.real = real;
}

this是当有实例变量与局部变量相同时使用的关键字。
另一个用途this是构造函数重载。它可以在重载的构造函数中调用构造函数。

2021-09-20T08:20:30   回复
IT小君

个人偏好,但我仅使用它来解决歧义,并且我想在极少数情况下可以明确分配的变量是一个字段。在某些项目中,人们在每个字段引用上都使用“this.field”。我发现这种做法在视觉上会让人分心,甚至令人讨厌,但您应该准备好偶尔看到这样的代码。

我暗自认为,对于那些编写 500 行包含 275 个“this”关键字的类的人来说,地狱有一个特殊的地方,但这种风格在一些开源项目中可以找到,所以我猜每个人都有自己的风格。

2021-09-20T08:20:30   回复
IT小君

将其用于克隆对象(通过复制构造函数传递自身的引用)。

对继承Cloneable.

public Foo implements Cloneable {
  private String bar;

  public Foo(Foo who) {
    bar = who.bar;
  }

  public Object getClone() {
    return new Foo(this);  //Return new copy of self.
  }
}
2021-09-20T08:20:31   回复