1

我是 java 的初学者,慢慢开始对这门语言有感觉。

我很难理解“这个”变量。

例如,哪个更好……为什么?

  public class Foo{
   int a;
   public Foo(int _a){
   a = _a;
     }
 }

对比

public class Foo{
   int a;
   public Foo(int _a){
   this.a = _a;
     }
 }

谢谢

4

5 回答 5

8

就个人而言,我讨厌那些使用下划线或“m_”来区分变量的约定。这就是 IDE 要明确的东西。

您用于this清楚地描绘属于当前实例的变量。

您的两个示例都没有任何优势。您可以通过查看生成的字节码向自己证明这一点。如果您使用 javap,您会看到两者编译为相同的代码。

在我看来,它更多地与你自己和其他程序员的可读性有关。像 IntelliJ 这样的优秀 IDE 使用突出显示和颜色编码使其更加清晰。

绝对需要的一种情况是方法参数和私有成员之间存在名称冲突。然后你必须用this它来消除编译器的歧义:

public class Foo {
    private int x;
    public void setX(int x) {
        this.x = x;  // this is required here.
    }
}
于 2012-09-25T02:38:40.133 回答
4

就语言而言,两者都不是“更好”,它们是完全等价的。

但是,有充分的理由更喜欢第二种选择,即代码更明确地说明了您正在做什么。

于 2012-09-25T02:36:45.080 回答
3

哪个更好是主观的事情。我更喜欢显式命名this.a(尽管我的变量会比这更具描述性),因为它清楚地表明您所指的内容属于当前对象。

否则,您必须去其他地方寻找确认。例如,它可以是在此点和函数开始之间的任何位置创建的局部变量。

于 2012-09-25T02:37:50.127 回答
2

从您上面发布的代码来看,没有区别。然而,有时 Java 的作用域和阴影机制使这成为必要。例如,虽然

public class Foo{
   int a;
   public Foo(int _a){
       this.a = _a;
   }
 }

是不必要的,这是一个

public class Foo{
   int a;
   public Foo(int a){
       this.a = a;
   }
 }

a当你有更复杂的变量名而不是简单的变量名时,这有时很有用。

对于某些 C++ 类型调用 this->something 实际上确实对变量的查找方式做了不同的事情,这可能是一个奇怪的现象。然而,Java 回避了所有这些细节。

于 2012-09-25T02:40:01.610 回答
2

在这种情况下,它们会生成相同的字节码,所以这实际上只是你选择哪种风格的问题。通常,this(严格来说,它不是一个变量)指的是当前指定的类,或者更常见的是它的一个实例(调用了当前指定的方法的实例)。

于 2012-09-25T02:42:12.320 回答