以下代码如下:
class Sample{
private void display(Sample this, int x){
System.out.println(x);
}
public static void main(String[] args) {
Sample s = new Sample();
s.display(10);
}
}如果我不将Sample类的引用变量作为实际参数(即s.display(10) )传递,那么上面的代码工作得很好。
我知道,从JDK 8开始,我们允许将它作为参数(形式参数)传递,并且作为第一个参数和编译器,在内部将Sample this作为第一个参数(或形式参数)插入,也就是说,如果不显式地将Sample this作为参数(或形式参数)写入Sample this(形式参数)。
但是,如果我试图将引用变量作为参数(实际参数)(即s.display(s, 10) )传递,那么即使实际参数和形式参数都相同,代码也不会编译。例:
class Sample{
private void display(Sample this, int x){
System.out.println(x);
}
public static void main(String[] args) {
Sample s = new Sample();
s.display(s, 10);
}
}没有编译上述代码的原因是什么?
发布于 2021-11-08 11:22:02
s.display(s, 10);不编译,因为编译器在内部将this引用传递给s,这就是为什么s.display(10)工作的原因--编译器使其与Sample.display(s, 10)相似,而s.display(s, 10)更像Sample.display(s, s, 10)。
将实例方法看作是静态方法,它隐式地获取this形式参数。现在尝试添加另一个方法,如static void display(Sample that, int x)。当你打电话给s.display(s, 10)时,应该叫哪一个?您可能假设使用this的是实例方法,但实际上调用的是静态方法(尽管编译器会警告以非静态方式访问静态方法)。
此外,如果允许您将display(Sample this, int x)称为s.display(s, 10),会发生什么情况?你也可以打电话给s.display(new Sample(), 10),现在你会有冲突,因为this不再提到s了。所以这是不允许的。
https://stackoverflow.com/questions/69882559
复制相似问题