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
是一个表达式或语句的关键字
- 当用作主表达式时,
this
表示一个值,该值是对调用实例方法的对象的引用。- 表达式:评估值的东西。 示例: x ++
- 关键字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等),可以防止简单的二进制操作,并且由语言语法强制执行。 这可以被视为其中之一。