繁体   English   中英

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

[英]'this' in Java: How does it work?

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

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

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

从语言学的角度来看, 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 ...”指令。 (看这里的细节。)

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

内的实例方法classthis (在大多数情况下)是指该对象。 这是一个相对的参考:当相同的方法在另一个对象被调用,则this该方法的执行内现指此第二个目的。

为了完整起见,应该提到的是,Java也有所谓的“合格” this可以用来指不是该方法在调用的对象,但内部的封闭对象class

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

参考

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

在Java中如何定义[this]?

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

的行为this定义在部分15.8.3说明书。 例如:

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

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

class Person
{
  string name;
  int age;
  void print(){ System.out.writeln(name+" "+age); }
}

就像那样(伪代码):

class Person
{
  string name;
  int age;
}

void print(Person this)
{
  System.out.writeln(this.name+" "+this.age);
}

思考它的一种方法是作为实例方法和构造函数的隐式参数。 在构造函数的情况下,构造函数的工作是设置“this”,而在实例方法的情况下,它们可以在适当的情况下对“this”进行操作。

请注意,Java也有一些语法糖,允许您隐式引用“this”的字段和方法,而不指定this.foo

this将为您提供实际实例的参考。 它在构造函数中很常见,例如:

class Dog {
   String name;

   public Dog(String name) {
      this.name = name;
   }
}

你可以想到'this'指的是它自己。 它就像我。[attribute]来访问自己的属性或方法。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM