在Java中,this.method()和method()之间有什么区别?

调用this.method()method() (包括性能差异)是否有区别?

唯一重要的是如果你正在使用OuterClass.this.method()例如

 class OuterClass { void method() { } class InnerClass { void method() { OuterClass.this.method(); // not the same as method(). } } } 

这些结构与生成的字节码完全没有区别,因此没有性能影响。 如果没有明确定义, this在编译期间解决。

使用明确this的唯一原因是可读性 – 有些人觉得更容易阅读,因为this表明这是一个当前对象的实例方法。

另外请注意,如果method()是静态的,那么使用this是不鼓励和误导的。

 private static void method() { } private void foo() { this.method(); //generates warning in my IDE for a reason } 

在这种情况下,它也不会对性能产生影响。

通过在命令行中调用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 } 

对于方法没有区别,但它可以与字段有所不同。 考虑这个代码:

 private String someObject = "some value"; public String someMethod(String someObject) { //this.someObject refers to the field while //someObject refers to the parameter } 

没有真正的区别 – 至less没有性能影响。 我更喜欢不写“这个” – IDE通常可以突出显示对此的调用,并且我认为当每次访问方法/字段/ …以“this”开头时,它的可读性较差。 但这确实是个人喜好的问题。

除了可读性以外,没有任何区别。 这使读者更清楚。

使用this.method()和/或this.myVar或不 – 在方法上没有区别,可能会有变数 – 但要保持一致。 我看到它遍布代码,有时我甚至看到this.m_myClassVar

就我个人而言,我更喜欢在我的类variables前面添加一个简单的下划线,并在我的方法参数上加上一个尾部的下划线:

 public MyClass { private int _myInt; public void myMethod(final int myInt_, final int fooFactor_) { _myInt = myInt_ * fooFactor_; } } 

虽然大多数IDE会清楚哪个是哪个,我发现这样做往往可以防止错误分配,并使代码的意图更清晰,IMO更易于阅读。

我使用_thisInstance.myMethod() (其中_thisInstance是对外部类的引用)或_thisInstance._myVar ,在内部类/侦听器/线程/等。 在哪里我需要清楚哪些类的调用方法和/或哪里需要引用类实例。

使用this.method()清楚地表明与该类的实例相关的函数被调用,而不是静态函数或属于另一个对象的函数。

正是那些喜欢在类中的所有成员variables上加上“m_”的C ++开发者的精神。 它使所有权明确。 我倾向于喜欢它,但是当你使用IDE来阐明使用颜色和字体的东西时,这并不重要。

你有没有试图在构造函数中做这个variables?

从理论上讲,在C ++中,由于对象还没有创build,所以没有这个。 我不确定Java的情况。