我是 java 的初学者,慢慢开始对这门语言有感觉。
我很难理解“这个”变量。
例如,哪个更好……为什么?
public class Foo{
int a;
public Foo(int _a){
a = _a;
}
}
对比
public class Foo{
int a;
public Foo(int _a){
this.a = _a;
}
}
谢谢
我是 java 的初学者,慢慢开始对这门语言有感觉。
我很难理解“这个”变量。
例如,哪个更好……为什么?
public class Foo{
int a;
public Foo(int _a){
a = _a;
}
}
对比
public class Foo{
int a;
public Foo(int _a){
this.a = _a;
}
}
谢谢
就个人而言,我讨厌那些使用下划线或“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.
}
}
就语言而言,两者都不是“更好”,它们是完全等价的。
但是,有充分的理由更喜欢第二种选择,即代码更明确地说明了您正在做什么。
哪个更好是主观的事情。我更喜欢显式命名this.a
(尽管我的变量会比这更具描述性),因为它清楚地表明您所指的内容属于当前对象。
否则,您必须去其他地方寻找确认。例如,它可以是在此点和函数开始之间的任何位置创建的局部变量。
从您上面发布的代码来看,没有区别。然而,有时 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 回避了所有这些细节。
在这种情况下,它们会生成相同的字节码,所以这实际上只是你选择哪种风格的问题。通常,this
(严格来说,它不是一个变量)指的是当前指定的类,或者更常见的是它的一个实例(调用了当前指定的方法的实例)。