Java中有“this”这个名字吗?

Eclipse会给出一个错误,“赋值的左侧必须是一个变量”,当我尝试类似的东西时:

public class Thing{ String a1; int a2; public void meth(){ Thing A = new Thing(); this = A; } } 

我必须分配每个变量( this.a1 = A.a1; this.a2 = A.a2; )作为解决方法。

是否有其他方法可以在不通过每个变量字段的情况下执行此操作
如果this不是一个变量,它叫什么?

this是一个伪变量 ,指向对象的当前实例,不能重新分配。 根据Java语言规范的第3.9节,它也被认为是该语言中的关键字。

不,没有简单的捷径。

如果“this”不是变量,它叫什么?

this不是一个变量,它是一个关键字 。

虽然this很特别,但在许多方面它都像一个参考。 因此,为了保持一致性, this = A必须是一个参考赋值,这没有多大意义。

您似乎期望this = A来执行从A this的逐字段复制,事实上Java的设计者可以选择在这种情况下执行此操作。 但是,这与其他参考作业不一致,将此作为例外的总体好处并不清楚。

this指的是this类的实例。

你无法分配给this

是一个java保留关键字,它引用当前对象。 它不是一个java保留关键字的变量。 所以this = A; 是无效的。 使用this关键字,我们可以引用当前对象的任何实例变量或方法。 你必须引用实例变量,如:

 this.a1 = A.a1; 

来自Doc

使用this关键字的最常见原因是因为字段被方法或构造函数参数遮蔽。

你不能用Java来分配this 。 这不是变数; 这是一个关键字。

如果您不需要特定实例,可以考虑的一件事就是return新实例。

 public class Thing{ String a1; int a2; public Thing meth(){ Thing A = new Thing(); return A; } } 

而且你会喜欢它

 whatever = whatever.meth(); 

根据java langspec§15.8.3, this是一个表达式语句关键字

  1. 当用作主表达式时, this表示一个值,该值是对调用实例方法的对象的引用。
    • 表达式:评估值的东西。 示例: x ++
  2. 关键字this也用在特殊的显式构造函数调用语句中
    • 语句:控制程序执行的语法元素,为其效果而执行但没有值示例: if(true)

在任何一种情况下,它都不是变量

  • 变量:具有关联类型的存储位置

在您的情况下, this是一个表达式而不是变量 。 但是对于所有意图而言,目的只是将其称为关键字

  • 关键字:由ASCII字母组成的字符序列保留供使用…不能用作变量名

this指的是方法的所有者。 在这种情况下,所有者是对象本身。

有时, this可能不是指您正在编写代码的类。 比如在烦人的阶级。 一个常见的例子是匿名监听器。

  button.addActionListener( new ActionListener() { public void actionPerformed(ActionEvent e) { this; // refers to the ActionListener } } ); 

另外,你可以返回this可以做method chaining 。 假设你有一个名为Homework的类,它有一个方法addTask。

 public Homework addTask(String task){ return this; } 

你可以调用addTask方法

 homework.addTask("a").addTask("b").addTask("c"); 

我认为OP要求能够将一个对象的内容分配给另一个对象,而不是为“this”指针分配新值。 C ++具有这种能力 – 你可以覆盖赋值运算符 – 但Java没有这种能力。

在某些偶然的情况下,这将是一个很好的function,但它目前根本不可能,并且它不太适合Java“模具”来提供将来的function。

如果Java允许对象嵌入其他对象(而不是简单地嵌入引用),那么该function将更有用(并且提供它的动机会更多),但这也不在卡片中。

在基本Java语言中,没有一种方法可以将所有字段的值从一个实例复制到另一个实例。 你通常不需要它。 您通常只需替换对新实例的引用或直接在目标实例上工作。

在您想要将对象的所有字段重置为初始值(并且很少需要它)的情况下,您通常使用重置方法,该方法在其自己的实例上工作,或者是在任何给定对象上工作的静态方法。

所以

 class A { String a1; int a2; void reset() { a1 = ""; a2 = 0; } } 

将被用作

 A a = new A(); // modify a a.reset(); 

 class A { String a1; int a2; static void reset(A anotherA) { anotherA.a1 = ""; anotherA.a2 = 0; } } 

并使用它像:

 A.reset(a); 

在这两种情况下,使用reset方法也可以在构造函数中设置初始值: A() { A.reset(this); } A() { A.reset(this); }A() { this.reset(); } A() { this.reset(); }

1实际上有一些库可以做到这一点,你可以在reflection的帮助下对它进行编码,我看到它的唯一原因是实现clone()方法或某种包装/存根。

听起来像你要做的就是有一个重新初始化你的对象的方法,即将它设置回它的初始值。 这就是你想要创建一个新对象并将其分配给当前对象的原因,对吧?

如果是这种情况,让我们尝试不同的方式,因为,正如已经说过的那样,你无法重新分配this

如果,而不是这样做,你尝试过这样的事情:

 public class Thing { String a1; int a2; public Thing() { this.meth(); } public void meth() { this.a1 = "a1"; this.a2 = 2; } } 

这样,Thing.meth()实际上初始化了你的对象,构造函数在创建对象时调用它。 然后你可以随时再打电话。

==免责声明,我不知道java ==

您可能需要手动分配。

我不确定你为什么要在Thing中创建一个新的Thing实例,但是由于你没有设置a1和a2的值,你需要按照你的方式分配它们。

这是一个保留关键字,指向它所在的类对象。

例如,如果你想要另一个名为fish()的函数,你的代码可能看起来像这样。

 public class Thing{ String a1; int a2; public Thing meth(){ Thing A = new Thing(); return A; } public Thing fish(){ this.a1 = "foo"; this.meth(); return A; } } 

当你这样做this = stuff; 你试图用另一个东西替换当前对象实例引用(在这种情况下,你在构造函数中初始化的那个),并且(在java的特定情况下)这是非法的,并且语言禁止你这样做。

想一想,如果你可以像这样替换对当前实例的引用,那么你可能会遇到一些严重的内存和安全问题(对构造对象的引用将会丢失并被某个未知对象覆盖)。

什么是完全有效的是使用.引用当前对象的成员. 运营商,因为他们拥有this ,所以不会出现任何问题(至少不是明显的问题)。

JVM具有一些内部安全措施(例如,方法最大堆栈大小validation,类文件格式validation等),可以防止简单的二进制操作,并且由语言语法强制执行。 这可以被视为其中之一。