Допустим есть такой код:
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
Оборудование для ресторана: новинки профессиональной кухонной техники
Частный дом престарелых в Киеве: комфорт, забота и профессиональный уход
Добрый день изучаю преобразование данных, очень токсичная тема но знать нужно, не могли бы объяснить - как из массива Integer[] сделать int[] и наоборот?
ну у меня получилось добавить кнопку, но смотря на код и в диспетчер задач есть подозрение, что я сделал что-то не такКто-нибудь может объяснить,...
Насколько знаю, для разных языков программирования существует достаточно много всяких библиотечек и фреймворков, позволяющих реализовать...
Мне нужно задать полином 2-го порядка от 3 неизвестных, взять от него производную 1-го порядка, а так же найти значения этих функций на некотором...