Добрый день!
Как пошагово работает этот код? Что здесь происходит?
Андрей
8 уровень
Как оно работает?
Обсуждается
Комментарии (14)
- популярные
- новые
- старые
Для того, чтобы оставить комментарий Вы должны авторизоваться
Андрей
16 октября 2018, 09:08
package com.javarush.task.task05.task0522;
/*
Максимум конструкторов
*/
public class Circle {
public double x;
public double y;
public double radius;
public Circle(double x, double y, double radius){
this.x=x;
this.y=y;
this.radius=radius;
}
public Circle(double radius){
this.x=4;
this.y=5;
this.radius=radius;
}
public Circle(double x, double radius){
this.x=x;
this.y=3;
this.radius=radius;
}
public Circle(){
this(3, 7, 11);
}
public static void main(String[] args) {
}
}
0
--------Master
16 октября 2018, 09:19
Строка this(3, 7, 11); находит подходящий конструктор с тремя параметрами и вызывает его, тот уже инициализирует поля класса переданными значениями. Другие конструкторы позволяют создавать объекты, передавая только часть параметров, не передаваемые будут инициализироваться значениями по умолчанию:
И приучайся сразу вставлять код с тегом code (кнопка на панели) +1
Андрей
16 октября 2018, 10:01
А почему первым выполняется этот конструктор?
а не первый в списке конструкторов по ходу кода?
В нем ведь тоже есть "this"...
Т.е., по какой логике выбираются конструкторы? 0
--------Master
16 октября 2018, 10:04
Конкретный конструктор вызывается в зависимости от перечня переданных при создании объекта параметров:
+1
Андрей
16 октября 2018, 10:22
Здесь мы создаем объект Circle без параметров. Поэтому вызывается конструктор
Тем самым мы проинициализировали переменные x=5, y=5, rad=1.
И вывели их в
после этого мы вызываем
с двумя параметрами. При двух параметрах вызывается конструктор
x=10 и y=5 передается здесь:
а rad=10 инициализируется из конструктора:
Правильно?
А если такой конструктор не вызывается. то почему его закомментирование приводит к невалидному коду?
0
--------Master
16 октября 2018, 10:25
Правильно, а по последнему - если закомментировать конструктор, то надо комментировать и все его вызовы из других конструкторов
0
Андрей
16 октября 2018, 10:29
А "все его вызовы из других конструкторов" - это
и
?
Это и есть вызов другого конструктора с тремя параметрами, то есть того самого комментируемого?
А чтобы избавиться от такого вызова, нужно вместо
что написать?
? +1
--------Master
16 октября 2018, 10:52
Да, получается так. Но задача именно демонстрирует возможность сокращения кода за счет вызова других конструкторов с параметрами по умолчанию: например, вместо трех строк в последнем блоке (х=5 и т.д.) написать просто this (...)
+1
Андрей
16 октября 2018, 14:33
спасибо!
+1
Андрей
16 октября 2018, 14:44
А как работает это?
Изначально было написано
то есть изначально это было операцией, а не конструктором. Убрал void - стало конструктором.
А как оно в целом-то работает?
У нас есть public class Circle. Мы создаем объект этого класса Circle circle = new Circle(); ? Т.е. создаем конкретный круг?
Если бы осталось public void Circle(), то это бы означало. что у нас нет конструктора? Но тогда бы отработал неявный конструктор, и объект круг бы создался. Верно?
А потом бы мы через сеттер circle.color.setDescription("Red"); установили бы ему цвет. Но почему-то так не работает, и нужно убирать тип возвращаемого значения, превращая операцию в конструктор. А почему так нужно делать?
Как этот код работает в кончном итоге? 0
--------Master
16 октября 2018, 14:54
Если ни одного явно объявленного конструктора нет, конструктор по умолчанию (без параметров) "объявляется" самим компилятором. А circle.color.setDescription("Red"); не работало бы потому, что объект circle создан и инициализирован, но его поле color по умолчанию хранит null: ссылка на объект не присвоена, соответственно и метод вызывать не у чего, для этого в конструкторе класса прописана инициализация color
+1
Андрей
16 октября 2018, 14:57
спасибо!!!
0
--------Master
16 октября 2018, 08:52
Телепатия пока у человечества развита слабо, поэтому для объяснения кода пока еще людям нужно видеть этот код...
+1
RiccioMaster
16 октября 2018, 08:57
Надо развивать интуицию.
Была надежда, что именно её проходят на стажировке... ))
+1