Допустим есть такой код:
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 ?
Если только эти фрагменты не являются частью другого, внешнего по отношению к ним класса, то они оба неправильны: метод 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)); // Площадь круга
....
В первом случае Вы внутри foo создаете новый объект класса Main, присваиваете его полю значение 5. Но при выходе из foo этот объект становится доступным для сборки мусора и недоступным извне. А во втором случае Вы просто полю присваиваете значение 5
Продвижение своими сайтами как стратегия роста и независимости