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

时间:2010-08-05 09:02:35

标签: java

我知道'this'在Java中作为参考。我们只能在班级成员中使用它。

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

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

7 个答案:

答案 0 :(得分:33)

从语言学的角度来看,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 ...”指令。 (详见here。)。

答案 1 :(得分:7)

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

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

为了完整起见,应该提到的是Java也有所谓的“限定”this,它可以用来引用不是调用该方法的对象,而是封闭内部class的对象。

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

参考

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

答案 2 :(得分:6)

  

Java中定义的[this]究竟是什么?

在Java中thisJava Language Specification定义为keyword,因此不是普通的变量名,并且具有特殊行为。

this的行为在规范的section 15.8.3中定义。例如:

  

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

答案 3 :(得分:5)

“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);
}

答案 4 :(得分:2)

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

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

答案 5 :(得分:1)

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

class Dog {
   String name;

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

答案 6 :(得分:0)

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