我是java的初学者,并且慢慢开始了解这种语言。
我很难理解“这个”变量。
例如,哪个更好......为什么?
public class Foo{
int a;
public Foo(int _a){
a = _a;
}
}
VS
public class Foo{
int a;
public Foo(int _a){
this.a = _a;
}
}
由于
答案 0 :(得分:8)
就个人而言,我讨厌那些使用下划线或“m_”区分变量的约定。这就是IDE要明确的内容。
使用this
清楚地描述属于当前实例的变量。
您的示例都没有任何优势。您可以通过查看生成的字节代码向自己证明。如果你使用javap,你会看到两个编译成相同的代码。
在我看来,这与你自己和其他程序员的可读性有关。良好的IDE,如IntelliJ,使用突出显示和颜色编码,使其更加清晰。
绝对需要的一种情况是方法参数和私有成员之间存在名称冲突。然后你必须使用this
来消除哪个编译器的歧义:
public class Foo {
private int x;
public void setX(int x) {
this.x = x; // this is required here.
}
}
答案 1 :(得分:4)
就语言而言,两者都“更好”,它们完全相同。
然而,有一个很好的理由更喜欢第二个选项,即代码更清楚你正在做什么。
答案 2 :(得分:3)
哪个更好是一个主观的事情。我更喜欢显式命名this.a
(虽然我的变量会比那更具描述性),因为它清楚地表明你所指的是属于当前对象的。
否则,你必须去别处寻找确认。例如,它可以是在此点和函数开始之间的任何位置创建的局部变量。
答案 3 :(得分: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 ++类型调用了这个 - >实际上确实做了一些与查找变量有关的东西。然而,Java回避了所有这些细节。
答案 4 :(得分:2)
在这种情况下,它们会生成相同的字节码,所以它实际上只是一种风格问题。通常,this
(严格来说不是变量)指的是当前正在指定的类,或者更常见的是它的一个实例(在其上调用当前正在指定的方法的实例)。