关于java:使用\\’this \\’调用实例方法与不使用\\’this \\’调用实例方法-有区别吗?

Calling Instance Method with 'this' vs. calling it without 'this' - is there a difference?

第8行和第9行对getName()的调用之间是否有区别?

如果是,那是什么?

这可能非常简单,但我进行了Google搜索,因此我获得的唯一结果是关于将this与字段一起使用,而不是与方法一起使用。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
class CallingInstanceMethodWithAndWithoutThis {

    private String getName() {
        return"Zarah";
    }

    private void printGetName() {
        System.out.println(getName());
        System.out.println(this.getName());
    }

    public static void main(String [] args) {
        new CallingInstanceMethodWithAndWithoutThis().printGetName();
    }

}


使用this与不使用之间没有区别。

实际上,要检查这一点,如果我们使用javap -p -c CallingInstanceMethodWithAndWithoutThis进行反汇编,则输出如下:

1
2
3
4
5
6
7
8
9
10
  private void printGetName();
    Code:
       0: getstatic     #19                 // Field java/lang/System.out:Ljava/io/PrintStream;
       3: aload_0
       4: invokespecial #25                 // Method getName:()Ljava/lang/String;
       7: invokevirtual #27                 // Method java/io/PrintStream.println:(Ljava/lang/String;)V
      10: getstatic     #19                 // Field java/lang/System.out:Ljava/io/PrintStream;
      13: aload_0
      14: invokespecial #25                 // Method getName:()Ljava/lang/String;
      17: invokevirtual #27                 // Method java/io/PrintStream.println:(Ljava/lang/String;)V

我们可以注意到第0行和第10行(我们在其中调用getName()方法的输出)是相同的,并且没有区别。


对于编译器没有什么区别,但是在某些情况下可能会导致冲突。通常不使用this就可以了,java编译器足够聪明,可以识别我们的意图,但是强烈建议无论如何都要使用this关键字(例如在setter中),IMO更清楚地了解该方法在哪里来自(如果您的类扩展了其他类,或者您静态地导入了一些方法)。


没有区别,只是使用的编码约定。此外,您可以要求Eclipse例如在不需要作为"保存操作"时自动删除" this "。