第 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更清楚地了解方法的来源(以防您的类扩展其他类或静态导入某些方法(。