【问题标题】:Calling Instance Method with 'this' vs. calling it without 'this' - is there a difference?使用“this”调用实例方法与不使用“this”调用它 - 有区别吗?
【发布时间】:2016-05-26 08:49:42
【问题描述】:

第 8 行对getName() 的调用和第 9 行的调用有什么区别。

如果是,那是什么?

这可能很简单,但我进行了 Google 搜索,我得到的唯一 SO result 是关于将 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();
    }

}

【问题讨论】:

  • 没有区别。
  • 您基本上在您的问题中包含了您的问题的副本。答案是一样的。
  • @pp_ 我提到了为什么它不是完全重复的。那是关于字段的。这是关于方法的。
  • 当然可以,但是为什么函数要不同呢?
  • @pp_ 为什么不应该函数会有所不同?如果你只是学习语言,显然情况并非如此。有些事情你可以用字段做而你不能用函数做,反之亦然。

标签: java object this instance instance-methods


【解决方案1】:

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

【讨论】:

    【解决方案2】:

    使用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() 方法)的输出是相同的,没有区别。

    【讨论】:

      【解决方案3】:

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

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2014-09-02
        • 2012-10-04
        • 1970-01-01
        • 1970-01-01
        • 2020-03-02
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多