使用 'this' 调用实例方法与不使用 'this' 调用实例方法 - 有区别吗?
Calling Instance Method with 'this' vs. calling it without 'this' - is there a difference?
第8行和第9行对getName()
的调用有区别吗
如果是,那是什么?
这可能非常简单,但我进行了 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();
}
}
没有区别,只是使用的编码约定。此外,您可以要求 Eclipse 例如在不需要时作为保存操作自动删除 "this"。
对于编译器来说没有区别,但在某些情况下可能会导致冲突。一般不使用 this
就可以,java 编译器足够聪明,可以识别我们的意图,但强烈建议无论如何使用 this
关键字(例如在 setters 中),IMO 更清楚了解该方法的来源(如果您的 class 扩展了其他方法或您静态导入了一些方法)。
使用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()
方法的地方)的输出相同,没有区别。
第8行和第9行对getName()
的调用有区别吗
如果是,那是什么?
这可能非常简单,但我进行了 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();
}
}
没有区别,只是使用的编码约定。此外,您可以要求 Eclipse 例如在不需要时作为保存操作自动删除 "this"。
对于编译器来说没有区别,但在某些情况下可能会导致冲突。一般不使用 this
就可以,java 编译器足够聪明,可以识别我们的意图,但强烈建议无论如何使用 this
关键字(例如在 setters 中),IMO 更清楚了解该方法的来源(如果您的 class 扩展了其他方法或您静态导入了一些方法)。
使用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()
方法的地方)的输出相同,没有区别。