【问题标题】:Where to use "this" in java? [duplicate]在java中哪里使用“this”? [复制]
【发布时间】:2015-05-27 17:41:38
【问题描述】:

据我所知,这用于以下情况:

  1. this 关键字用于引用与局部变量同名的实例变量。
  2. 在同一类中调用一个构造函数到另一个构造函数。
  3. 将类实例作为参数传递给方法。
  4. 访问外部类变量。

但我已经浏览了我的项目代码,他们在 getter 中使用它,例如:

class a {
    int time;

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

据我所知,每个对象都有自己的实例变量和方法的副本,因此以这种方式返回是有意义的。 请澄清。

Stackoverfow 问题参考:When should I use "this" in a class?

【问题讨论】:

  • this 指的是当前对象实例,所以this.time 指的是“它自己的实例变量副本”。虽然它是可选的。许多程序员在引用实例变量时不使用this。不过,@SrinathGanesh 显示的代码对于构造函数来说是一个很好的约定。

标签: java this getter-setter


【解决方案1】:

很多人(我也是其中之一)使用this 关键字,即使没有明确需要。

  • 有些人发现将this放在属于同一类的任何东西前面更清楚,同样的逻辑适用于super
  • 有些人总是通过反射使用this,以便在某些 IDE 中更好地自动完成(弹出窗口自动出现,懒惰的程序员)。

这些观点主要基于意见,并不重要。

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

但是,IMO,没有多个同名变量会更简单。

【讨论】:

    【解决方案2】:

    当你有类似下面的方法时:

    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;
    } 
    

    严格等价。

    【讨论】:

      【解决方案3】:

      关键字“this”用于引用当前正在使用的 Reference 对象。这只是用作语法糖,以便更轻松地执行某些任务,例如调用同一类中的构造函数、访问同一类中的字段、参数类型..

      以下是两种不同编程风格的示例。两者都做同样的事情,但第一个示例使用 '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); }
          }
      

      【讨论】:

        【解决方案4】:

        关键字“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
                }});
            }
        }
        

        【讨论】:

          猜你喜欢
          • 2017-07-23
          • 1970-01-01
          • 2019-03-22
          • 2018-07-09
          • 2013-01-06
          • 2014-08-15
          • 2013-04-01
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多