在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的情况。