调用this.method()
和method()
(包括效果差异)之间有什么区别吗?
答案 0 :(得分:58)
唯一重要的是你使用OuterClass.this.method()
例如
class OuterClass {
void method() { }
class InnerClass {
void method() {
OuterClass.this.method(); // not the same as method().
}
}
}
答案 1 :(得分:27)
这些构造之间完全没有区别,生成的字节码将完全相同,因此不会影响性能。如果没有明确定义,则在编译期间解析this
。
使用显式this
的唯一原因是可读性 - 有些人发现它更容易阅读,因为this
表明这是当前对象的实例方法。
另请注意,如果method()
是静态的,则不鼓励使用this
并误导。
private static void method() {
}
private void foo() {
this.method(); //generates warning in my IDE for a reason
}
在这种情况下,它对性能也没有影响。
答案 2 :(得分:18)
通过在命令行上调用javap -c ClassName
可以看出没有区别。
例如:
public class This {
private void method() {
}
public void noThis() {
method();
}
public void useThis() {
this.method();
}
}
产生以下反汇编输出:
Compiled from "This.java"
public class This extends java.lang.Object{
public This();
Code:
0: aload_0
1: invokespecial #1; //Method java/lang/Object."<init>":()V
4: return
public void noThis();
Code:
0: aload_0
1: invokespecial #2; //Method method:()V
4: return
public void useThis();
Code:
0: aload_0
1: invokespecial #2; //Method method:()V
4: return
}
答案 3 :(得分:5)
对于方法没有区别,但它可以对字段产生影响。请考虑以下代码:
private String someObject = "some value";
public String someMethod(String someObject) {
//this.someObject refers to the field while
//someObject refers to the parameter
}
答案 4 :(得分:2)
没有真正的区别 - 至少没有性能影响。我不喜欢写“this” - IDE通常可以突出显示对此的调用,并且我认为当每次访问方法/字段/ ...都以“this”开头时,它的可读性会降低。但这确实是个人偏好的问题。
答案 5 :(得分:2)
除了可读性之外没有任何区别。它使读者更清楚。
答案 6 :(得分:2)
使用this.method()
和/或this.myVar
或不使用 - 对方法没有区别,对于可能存在的变量 - 但要保持一致。我看到它遍及整个代码,有时我甚至会看到this.m_myClassVar
。
就个人而言,我更喜欢使用简单的下划线为我的类变量添加前缀,并在我的方法args上添加一个尾随下划线:
public MyClass
{
private int _myInt;
public void myMethod(final int myInt_, final int fooFactor_)
{
_myInt = myInt_ * fooFactor_;
}
}
虽然大多数IDE会清楚说明哪个是哪个,但我发现这可以防止错误分配并使代码的意图更清晰,IMO更容易阅读。
我在内部类/侦听器/ threads / etc中使用_thisInstance.myMethod()
(其中_thisInstance
是对外部类的引用)或_thisInstance._myVar
。在哪里我需要清楚我正在调用哪个类的方法和/或我需要引用类实例的位置。
答案 7 :(得分:1)
使用this.method()清楚地表明正在调用与该类实例相关联的函数,而不是静态函数或属于另一个对象的函数。
那些喜欢在类中的所有成员变量上加上“m_”的C ++开发人员的精神。它使所有权明确无误。我倾向于喜欢它,但是当你使用IDE来澄清使用颜色和字体的东西时,它并不重要。
答案 8 :(得分:-3)
您是否尝试过在构造函数中执行此操作?
理论上,在C ++中,由于尚未创建对象,因此没有这个。我不确定Java的情况。