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();
}
} |
- 没有区别。
-
您基本上将问题的重复内容包括在问题中。答案是一样的。
-
@pp_我提到了为什么它不是精确的重复项。那是关于领域的。这是关于方法的。
-
当然可以,但是为什么功能上应该有所不同呢?
-
链接的问题是关于this关键字的,您的也是。
-
@pp_为什么功能不应该有所不同?如果您只是在学习语言,显然不是这样。您可以使用字段执行某些操作,而不能使用函数执行某些操作,反之亦然。
-
如果您知道this的作用,那么您也会知道问题的答案。
-
pp_出于这个原因,您刚刚否决了我的问题吗?为什么字段和功能会有所不同?好吧,许多事情对于不同的事情有不同的作用。这是一个完全有效的问题。我与另一个问题联系在一起的原因是让人们知道我已经看到了这一点,但我仍然不太
使用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 "。