当前位置: 首页 > 面试题库 >

Java:使用“ this”作为实例方法的参数/参数名称吗?

赵光赫
2023-03-14
问题内容

最近从这个问题中我了解到以下内容似乎是合法的java:

class Bar {
    void foo(Bar this) {}
}

现在,我试图找到在Java标准中允许您执行此操作的位置,并查看了此处,但找不到该部分。

有人可以引用允许这种形式的方法声明的地方,以及声明命名实参的限制this是什么?


问题答案:

它在1.8或更高版本的JDK中有效。

这里是JLS说

接收器参数是实例方法或内部类的构造函数的可选语法设备。对于实例方法,接收器参数代表为其调用该方法的对象。对于内部类的构造函数,接收器参数表示新构造对象的直接封闭实例。无论哪种方式,接收器参数仅存在是为了允许在源代码中表示所表示对象的类型,以便可以对类型进行注释。

如果您阅读完整的要点,则会发现以下提示,

在允许接收方参数的地方,其类型和名称指定如下:

  • 在实例方法中,接收方参数的类型必须是在其中声明该方法的类或接口,并且接收方参数的名称必须是this。 否则,将发生编译时错误。

  • 在内部类的构造函数中,接收器参数的类型必须是该类或接口,该类或接口是内部类的立即封闭类型声明,并且接收器参数的名称必须是Identifier。 其中,标识符是类或接口的简单名称,它是内部类的立即封闭类型声明;否则,将发生编译时错误。



 类似资料:
  • 问题内容: 我正在尝试进行设置,以便将表名作为参数传递给命令文本,但是我无法使其正常工作。我四处张望,发现了这样的问题:使用C#进行MySQL的参数化查询,但是我没有任何运气。 这是相关的代码(connection == 包含连接字符串): 如果我更改: 至: 作为一种测试方法,它是可行的(我正在将XML从数据集中写入控制台以进行检查)。因此,我很确定问题只是以错误的方式使用了参数功能。有指针吗?

  • 问题内容: 下面的代码之间有什么区别?将参数声明为是有什么好处? 问题答案: 由于形式方法的参数是局部变量,因此只有在内部匿名类被声明为final的情况下,您才能从内部匿名类访问它们。 这使您不必在方法主体中声明另一个局部最终变量:

  • 问题内容: 在 Java 6中 ,假设我具有以下方法签名: 我想知道在运行时传递给任何其他参数的值,这里重要的一点是我想通过参数名称获取该值。 我知道如何使用或获取参数类型的列表。 理想情况下,我想获取参数 名称 而不是类型的列表。有办法吗? 问题答案: 如果您告诉编译器将其包括在内,则可以使用参数名称(使用调试信息进行编译)。Spring 可以帮助您获取名称。该默认实现使用ASM 这样做。 与您

  • 问题内容: 给定以下Go方法: 我想反映参数的名称(在这里)。 我尝试了以下操作,但是它返回了结构名称(在这里): 如何获得参数名称? 问题答案: 无法获取方法或函数的参数名称。 这样做的原因是因为名称对于调用方法或函数的人并不是很重要。重要的是参数的类型及其顺序。 甲功能类型表示集合的具有相同参数和结果类型的所有功能。无论参数名称如何,具有相同参数和结果类型的2个函数的类型均相同。以下代码显示:

  • 问题内容: 在Java编程语言中,对对象的方法调用通过隐式传递对对象的引用来作用于对象并作为静态方法来工作吗? 问题答案: 有关方法调用如何工作的详细信息,请参见Java SE 7 JVM规范的3.7节 。对于实例方法,将引用作为第一个参数传递。该引用还用于选择要调用的方法,因为它可能在子类中被覆盖,因此它比静态方法要复杂一些。

  • 问题内容: 我正在寻找一种通过引用传递方法的方法。我知道Java不会将方法作为参数传递,但是,我想找到一种替代方法。 有人告诉我接口是将方法作为参数传递的替代方法,但我不了解接口如何通过引用充当方法。如果我理解正确,那么接口就是一组未定义的抽象方法。我不想发送每次都需要定义的接口,因为几种不同的方法可以使用相同的参数调用同一方法。 我要完成的工作与此类似: 调用如: 问题答案: 编辑:从Java