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

时间:2011-07-01 11:22:32

标签: java methods

调用this.method()method()(包括效果差异)之间有什么区别吗?

9 个答案:

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