Подтвердить что ты не робот

Есть ли имя для "this" в Java?

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 не является переменной, что она называется?

4b9b3361

Ответ 1

this - псевдопеременная, которая указывает на текущий экземпляр объекта, его нельзя переназначить. Он также рассмотрел ключевое слово на языке, в соответствии с разделом §3.9 Спецификация языка Java.

Ответ 2

Нет, нет простого ярлыка.

И если "this" не является переменной, что она называется?

this не является переменной, это keyword.

Несмотря на то, что this является особенным, во многих отношениях он действует как ссылка. Поэтому для согласованности this = A должно быть ссылочным назначением, что не имеет смысла.

Кажется, вы ожидаете, что this = A будет выполнять по каждому полю копию с A до this, и разработчики Java могли бы сделать это в этом случае. Однако это будет несовместимо с другими назначениями ссылок, и общие выгоды от наличия этого в качестве исключения не совсем ясны.

Ответ 3

this относится к экземпляру this класса.

Вы не можете назначить this

Ответ 4

this - это ключевое слово java reserved, которое относится к текущему объекту. это не переменная, а ключевое слово, зарезервированное для Java. поэтому this = A; недействителен. используя ключевое слово this, мы можем ссылаться на любую переменную или метод экземпляра текущего объекта. вы должны обратиться к переменной экземпляра, например:

this.a1 = A.a1;

От Doc:

Наиболее распространенная причина использования этого ключевого слова заключается в том, что поле затенен параметром метода или конструктора.

Ответ 5

Вы не можете назначить this в Java. Это не переменная; это ключевое слово.

Одна вещь, которую вы могли бы рассмотреть, если вам не нужен конкретный экземпляр, - это просто return для вашего нового экземпляра.

public class Thing{

  String a1;
  int a2;

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

и вы будете использовать его как

whatever = whatever.meth();

Ответ 6

Согласно java lang spec §15.8.3 this - ключевое слово , которое либо является выражение или

  • При использовании в качестве основного выражения this обозначает значение, которое является ссылкой на объект, для которого был вызван метод экземпляра.
    • Выражение: То, что оценивается значением. Пример: x ++
  • Ключевое слово this также используется в специальном явном вызове конструктора statement
    • Заявление: Синтаксические элементы, управляющие выполнением программы, которые выполняются для их эффекта и не имеют значений. Пример: if (true)

В любом случае это не переменная

  • Переменная: Место хранения с ассоциированным типом

В вашем случае this является выражением , а не переменной . Но для всех целей цели просто называют это ключевым словом

  • Ключевое слово: Последовательность символов, сформированная из букв ASCII, зарезервирована для использования..., которая не может использоваться как имя переменной

Ответ 7

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

Ответ 8

Я думаю, что OP просит возможность назначить содержимое одного объекта другому, а не назначать новое значение указателю "this". У С++ есть эта способность - вы можете переопределить оператор присваивания, но Java не имеет таких возможностей.

Было бы неплохо иметь возможность в некоторых случаях, но это просто невозможно в настоящее время, и это не очень подходит для "плесени" Java, чтобы обеспечить эту функцию в будущем.

Возможность была бы более полезной (и было бы больше мотивации для ее предоставления), если бы Java разрешал объекты внедряться в другие объекты (а не просто вставлять ссылки), но и не в карты.

Ответ 9

Нет способа 1 копировать значения всех полей из одного экземпляра в другой на базовом языке Java. И вам, как правило, не нужно. Вы можете чаще всего заменять ссылку на новый экземпляр или работать непосредственно с целевым экземпляром.

В вашем случае, когда вы хотите reset все поля объекта к исходным значениям (и их редко требуется), вы обычно используете метод reset, который истребитель работает в своем собственном экземпляре или является статический, работающий на любом заданном объекте.

Итак,

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() { this.reset(); }

1 на самом деле есть некоторые библиотеки, чтобы сделать это, и вы можете его кодировать с помощью отражения, единственная причина, по которой я вижу, что он используется, - это реализовать метод clone() или для некоторых вид обертывания/обрезания.

Ответ 10

Мне кажется, что то, что вы пытаетесь сделать, это метод, который повторно инициализирует ваш объект, т.е. возвращает ему исходные значения. Итак, почему вы хотите создать новый объект и назначить его текущему объекту, правильно?

Если это случай, попробуйте другой способ сделать это, так как, как уже было сказано, вы не можете переназначить this.

Что, если вместо этого вы пробовали что-то вроде этого:

public class Thing {

    String a1;
    int a2;

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

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

}

Таким образом, Thing.meth() фактически инициализирует ваш объект, и конструктор вызывает его при создании объекта. Затем вы можете называть его снова, когда захотите.

Ответ 11

== Отказ от ответственности, я не знаю 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;
  }
}

Ответ 12

Когда вы выполняете this = stuff;, вы пытаетесь заменить ссылку экземпляра объекта current объекта (в этом случае, тот, который вы инициализируете в конструкторе), с другой вещью, и (в частности случай java), который запрещен, и язык запрещает вам делать это.

Подумайте об этом, если бы вы могли заменить ссылку на ваш текущий экземпляр именно так, тогда вы можете столкнуться с серьезными проблемами памяти и безопасности (ссылка на построенный объект будет потеряна и переопределена каким-либо неизвестным объектом).

Что абсолютно справедливо, ссылаясь на членов вашего текущего объекта с помощью оператора ., потому что они принадлежат this, поэтому проблем не должно возникать (по крайней мере, не очевидных).

В JVM есть некоторые внутренние меры безопасности (например, проверка размера стека метода max, проверка формата файла класса и т.д.), что предотвращает легкую двоичную манипуляцию и обеспечивается синтаксисом языка. Это можно рассматривать как один из них.