Чем отличается новый объект от this?

151
16 декабря 2019, 22:40

Допустим есть такой код:

public class Main{
   int a;
   char arr[] = new char[5];
   String word = "";
}
 void foo(){
   Main m = new Main();
   m.a = 5;
}

И вот такой:

public class Main{
   int a;
   char arr[] = new char[5];
   String word = "";
}
void foo(){
   this.a = 5;
}

Чем отличаются эти куски кода ? А именно чем отличается создание объекта от this ?

Answer 1

Если только эти фрагменты не являются частью другого, внешнего по отношению к ним класса, то они оба неправильны: метод foo() не относится ни к какому классу (а класс Main не содержит ни одного метода). Ни один из этих фрагментов не откомпилируеся. Если же предположить, что эти фрагменты являются частями внешнего класса (назовем его Outer), то

  • В первом фрагменте метод foo() класса Outer создает новый объект класса Main (который при создании инициализирует свои поля arr и word), присваивает его полю a значение 5, но этот новый объект и его поля никак не могут быть использованы, поскольку переменная m -- локальная, ее область видимости ограничена методом foo(), извне метода она недоступна и при выходе из метода уничтожается.
  • Во втором фрагменте метод foo() присваивает значение 5 полю a объекта класса Outer, поскольку метод foo() относится к классу Outer и в таком методе ключевое слово this означает объект, к которому относится метод. Объект класса Main во втором фрагменте не создается и соответственно никакие его поля не существуют, не инициализируются и не модифицируются.

Что касается второго вопроса -- отличие this от new состоит в следующем:

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

  void setName(String name) {
    this.name = name; // Присваиваем полю name значение параметра name
  }

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

  class MyClass{
    String name;
    int age;
    MyClass(String name) {
      this.name = name; 
    }
    MyClass(String name, int age) {
      this(name); // Вызов первого конструктора
      this.age = age; 
    }
  }

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

  ....
  BigDecimal r = new BigDecimal("1234567890123456789.123456789")  
  BigDecimal pi = new BigDecimal("3.1415926535897932384626433832795"); 
  BigDecimal square = pi.multiply(r.pow(2)); // Площадь круга
  ....
Answer 2

В первом случае Вы внутри foo создаете новый объект класса Main, присваиваете его полю значение 5. Но при выходе из foo этот объект становится доступным для сборки мусора и недоступным извне. А во втором случае Вы просто полю присваиваете значение 5

READ ALSO
Как из массива Integer[] сделать int[] и наоборот?

Как из массива Integer[] сделать int[] и наоборот?

Добрый день изучаю преобразование данных, очень токсичная тема но знать нужно, не могли бы объяснить - как из массива Integer[] сделать int[] и наоборот?

173
libgdx добавление красивой кнопки)

libgdx добавление красивой кнопки)

ну у меня получилось добавить кнопку, но смотря на код и в диспетчер задач есть подозрение, что я сделал что-то не такКто-нибудь может объяснить,...

188
RPC over serial port - адекватно ли? Как делают в Enterprise?

RPC over serial port - адекватно ли? Как делают в Enterprise?

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

170
Как пользоваться классом DerivatveStructure?

Как пользоваться классом DerivatveStructure?

Мне нужно задать полином 2-го порядка от 3 неизвестных, взять от него производную 1-го порядка, а так же найти значения этих функций на некотором...

158