是否有“本”在Java中的名字吗?(Is there a name for “this” in Ja

2019-07-05 02:08发布

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不是一个变量是什么叫?

Answer 1:

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



Answer 2:

没有,没有容易的捷径。

如果“这”不是一个变量是什么叫?

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

虽然this是特殊的,在许多方面,它像一个参考。 因此,为了保持一致性, this = A必须是一个参考的分配,这并不完全意义。

你似乎在期待this = A执行从场逐场复制Athis ,确实Java的设计者可以选择做,在这种情况下。 然而,这将是与其他参考分配不一致,且这是一个例外的整体效益并不完全清楚。



Answer 3:

this指的是this类的实例。

你不能分配给this



Answer 4:

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

this.a1 = A.a1;

从文档

使用该关键字的最常见的原因是因为一个域是由一个方法或构造参数阴影。



Answer 5:

您不能分配到this Java编写的。 这不是一个变量; 这是一个关键字。

你可能会考虑,如果你并不需要一个特定的实例一件事,就是刚刚return荷兰国际集团新的实例。

public class Thing{

  String a1;
  int a2;

  public Thing meth(){
    Thing A = new Thing();
    return A;
  }
}

你会使用它像

whatever = whatever.meth();


Answer 6:

据的java郎规格§15.8.3 this是或者是一个表达式语句关键词

  1. 当用作主要的表达式中使用this表示值,该值是被调用的量,实例方法的对象的引用。
    • 表达:东西将计算得到一个值。 例如:X ++
  2. 关键字这也是一个特殊的明确的构造函数调用语句中使用
    • 语句:控制程序,其为它们的效果执行的执行和不具有值实施例的句法元素: 如果(真)

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

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

在你的情况this是一个表达式 ,而不是一个变量 。 但对于所有意图的目的只是把它的关键词

  • 关键字:一个字符序列,由ASCII字母组成,保留用于......不能用作变量名


Answer 7:

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

有时, this可能不是指你在编写代码的类。 比如在annoymous类。 一个常见的例子是匿名侦听器。

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

此外,您可以返回this可以做method chaining 。 假设你有一个类叫作业,它有一个方法addTask。

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

你可以调用addTask方法类似

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


Answer 8:

我觉得OP是要求一个对象的内容分配到另一个,而不是一个新的值分配给“this”指针的能力。 C ++有这个能力 - 你可以重写赋值运算符 - 但Java有没有这样的能力。

这将是一个很好的功能在一些偶然的情况下,但它只是当前没有可能的,而且它并没有真正适合的Java“模子”,以在未来提供的功能。

该功能将更为有用(和将有更多的动机来提供的话),如果Java的允许嵌入到其他对象(VS仅仅将嵌入引用)的对象,但是这不是在卡两种。



Answer 9:

有没有在基本的Java语言的一个实例的所有字段的值复制到另一个1路。 你通常不需要它。 你可以经常只需更换参照新的实例或者直接在目标实例工作。

在当你想一个对象的所有字段重置为初始值(并有罕需要它),你的情况下,你通常使用的eighter它自己的实例作品或者是静态的任何给定对象上工作的复位方法。

所以

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

在两种情况下是有意义的也使用重置方法在构造设置初始值: A() { A.reset(this); } A() { A.reset(this); }A() { this.reset(); } A() { this.reset(); }

1其实有一些图书馆做它,你可以反射的帮助代码时,我看到它是使用的唯一理由就是实现一个clone()方法或某种包装/存根的。



Answer 10:

这听起来像你对我正在试图做的是有一个重新初始化你的对象,即设置的回其初始值的方法。 这就是为什么你要创建一个新的对象,并将其分配给当前对象,对不对?

如果是这样的话,让我们尝试做不同的方式,因为,正如人们所说的,你不能重新分配this

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

public class Thing {

    String a1;
    int a2;

    public Thing() {
        this.meth();
    }

    public void meth() {
        this.a1 = "a1";
        this.a2 = 2;
    }

}

这样一来,Thing.meth()实际上初始化你的对象,并在构造函数调用它创建对象时。 然后,你可以再次调用它,只要你想。



Answer 11:

==免责声明,我不知道Java的==

你想手动分配。

我不知道你为什么要创建内部事情的事的新实例,但是因为你不设置的A1值和a2你需要给它们分配你的方式。

这是一个指向类对象是内保留关键字。

例如,如果你想有另一个名为鱼()函数的代码可能是这个样子。

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


Answer 12:

当你做this = stuff; 你试图取代当前对象实例引用(在这种情况下,你是在构造函数初始化一个)与其他的事情,(在Java中的特殊情况),那是违法的语言禁止你做这件事的。

想想看,如果你能代替参考当前的实例就是这样,那么你可以在一些严重的内存和安全问题承担(以构建对象的引用将会丢失,被一些不明物体overrided)。

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

JVM有一些内的安全措施(例如,方法最大堆栈大小验证,类文件格式验证,等等),从容易操作的二进制防止和通过语言的语法被执行。 这可以被看作是其中的一个。



文章来源: Is there a name for “this” in Java?