使用 'this' 调用实例方法与不使用'this'调用实例方法 - 有区别吗?



第 8 行对 getName() 的调用和第 9 行的调用之间有什么区别吗?

如果是,那是什么?

这可能非常简单,但我做了我的谷歌搜索,我得到的唯一 SO 结果是将this与字段一起使用,而不是方法。

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();
    }
}

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

使用 this 和不使用 没有区别。

为了检查这一点,事实上,如果我们使用 javap -p -c CallingInstanceMethodWithAndWithoutThis 执行反汇编,输出如下:

  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关键字(例如在setters中(,IMO更清楚地了解方法的来源(以防您的类扩展其他类或静态导入某些方法(。

最新更新