在Java中什么情况下使用"this"?

6
据我所知,以下情况会使用this关键字:
  1. 当我们想引用与局部变量同名的实例变量时使用。
  2. 在同一类中调用一个构造函数到另一个构造函数。
  3. 将类实例作为参数传递给方法。
  4. 访问外部类变量。
但是,在我的项目代码中,他们在getter方法中使用了this
class a {
    int time;

    int getValue() {
        return this.time * 5.;
    }
}

据我所知,每个对象都有自己的实例变量和方法副本,因此以这种方式返回是否有意义,请澄清。
引用的Stackoverfow问题:在类中应何时使用“this”?

3
this 指代当前对象实例,因此 this.time 意为“它自己的实例变量副本”。但这是可选的。许多程序员在涉及实例变量时不使用 this。@SrinathGanesh 展示的代码是构造函数的一个好的习惯用法。 - DavidS
4个回答

9
很多人(我也是其中之一)即使不需要明确使用,也会使用 this 关键字。
  • 有些人发现将 this 放在属于同一类的任何东西前面更清晰,这个逻辑同样适用于 super
  • 有些人总是出于惯性使用 this,以获得更好的自动完成(弹出窗口自动出现,懒惰的程序员)在某些 IDE 中。

这些观点大多基于个人意见,并不真正重要。

对于其他用途,如你所提到的,它可以用于传递参数到另一个构造函数,传递类实例或区分具有相同名称的两个变量。

然而,在我看来,只需不要有多个具有相同名称的变量就可以简单解决问题。


6

当你有以下这样的一个方法时:

public void setFoo(Foo foo) {
    this.foo = foo;
}

必须使用this,否则它会将参数foo赋值给自身,而不是赋值给实例变量。

但这并不意味着这是你唯一可以使用this的情况。以下代码是严格等价的:

public void setFoo(Foo newFoo) {
    this.foo = newFoo;
}

尽管在那种情况下,你可能会写成:
public void setFoo(Foo newFoo) {
    foo = newFoo;
}

因为this已经不再必要。这并不意味着它是非法的

所以,

int getValue() {
    return time * 5;
}

并且。
int getValue() {
    return this.time * 5;
} 

严格等价。


1
关键字“this”用于引用当前正在使用的引用对象。这只是用作语法糖,使执行某些任务(例如在同一类中调用构造函数、访问同一类中的字段、参数类型等)更容易。
以下是两种不同编程风格的示例。两者都可以完成相同的任务,但第一个示例使用“this”显式地再次调用构造函数。
    public class Foo {
    public Foo() { this("Hello"); } //Explicit constructor call
    public Foo(String string) { System.out.print(string); }
    }

    public class Bar {
    public Bar() { new Bar("Hello"); }
    public Bar(String string) { System.out.print(string); }
    }

1
关键字“this”经常用于匿名类中,以引用包含类中的字段。例如:
public class App 
{
    public String myString = "This is Java";
    public App()
    {
        JButton button = new JButton("Test");
        button.addActionListener(new ActionListener(){

        @Override
        public void actionPerformed(ActionEvent arg0)
        {
            System.out.println(App.this.myString); // <-- App.this gives access to public fields in App
        }});
    }
}

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接