首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >不能在实际参数中传递对象的引用变量(如果使用此参数作为形式参数)

不能在实际参数中传递对象的引用变量(如果使用此参数作为形式参数)
EN

Stack Overflow用户
提问于 2021-11-08 11:13:06
回答 1查看 52关注 0票数 1

以下代码如下:

代码语言:javascript
运行
复制
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) )传递,那么即使实际参数和形式参数都相同,代码也不会编译。例:

代码语言:javascript
运行
复制
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);
  }
}

没有编译上述代码的原因是什么?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 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了。所以这是不允许的。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/69882559

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档