Java中的'this':它是如何工作的?

ani*_*nil 8 java

我知道'this'在Java中起到了参考作用.我们只能在类成员中使用它.

我要问的是...因为它在类的成员中使用,这意味着它必须是实例变量或参数.

并假设,如果它是一个方法的参数,但它是在块中工作.block不包含任何params和all ..你能解释它是什么...它在java中的定义是什么?它是如何使用By JVM的.

Ste*_*n C 32

从语言学的角度来看,this既不是局部变量也不是参数.从语法上讲,它是一个关键字.从语义上讲,它是一种表达"当前对象"的明确方式; 见JLS 15.8.3.例如:

  • this.<attributeName> 显式引用当前对象的实例级属性.
  • <methodName>(this) 调用方法,将对当前对象的引用作为显式参数传递.

this关键字在Java中具有其他用途,并不完全意味着"当前对象":

  • this(<optArgumentList>)作为构造函数中的第一个语句链接到同一个类中的另一个构造函数; JLS 8.8.7.
  • <className>.this内部类中的内容是指当前对象的封闭类的实例; JLS 15.8.4.

从实现的角度来看,您可以将"this"引用视为每次调用实例方法时传递的隐藏或隐式参数.实际上,这或多或少是JVM的"invoke*"字节码处理对象引用的方式.将目标对象引用推送到"opstack"后跟每个参数值,然后执行"invoke ..."指令.(看这里的细节.)

  • +1知道链接到详细信息令人印象深刻! (4认同)
  • @polygenelubricants - 我借用了你的参考文献.谢谢. (3认同)

pol*_*nts 7

实例方法在实际实例(实际对象)的上下文中调用.

在a的实例方法中class,this(在大多数上下文中)引用此对象.这是一个相对引用:当在另一个对象上调用相同的方法时,那么this在该方法的执行中现在引用该第二个对象.

为了完整起见,应该提到Java也有所谓的"qualified" this,它可以用来指代调用该方法的对象,而不是内部的封闭对象class.

在构造函数中,它也可以出现一些限制,以调用同一个类的另一个构造函数.super也可以这种方式使用.

参考

  • JLS 15.8.3 this
    • 当用作主表达式时,关键字this表示一个值,该值是对其调用实例方法的对象的引用,或者是对正在构造的对象的引用.
  • JLS 15.8.4合格 this
    • 可以通过显式限定关键字来引用任何词汇封闭实例this.
  • JLS 8.8.7.1显式构造函数调用
    • 替代构造函数调用以关键字this开头(可能以显式类型参数开头).它们用于调用同一类的备用构造函数.


Mar*_*ers 6

在Java中如何定义[this]?

在Java this中,Java语言规范将其定义为关键字,因此不是普通的变量名,并且具有特殊的行为.

行为在规范的第15.8.3节中this定义.例如:

当用作主表达式时,关键字this表示一个值,即对调用实例方法的对象(第15.12节)或对正在构造的对象的引用.


cod*_*nix 5

对于您所做的每个非静态方法调用,"this"被隐式传递为参数.您可以将其视为语法糖,但在机器级别,它确实是一个传递的附加参数.

class Person
{
  string name;
  int age;
  void print(){ System.out.writeln(name+" "+age); }
}
Run Code Online (Sandbox Code Playgroud)

就像那样(伪代码):

class Person
{
  string name;
  int age;
}

void print(Person this)
{
  System.out.writeln(this.name+" "+this.age);
}
Run Code Online (Sandbox Code Playgroud)