Эта задача мне покая второй день не дает, нужно налаживать отношения с дебагером, а у меня совсем нет понимания, что он, паразит, делает:)
Не совсем понятно, как происходит инициализация. Запускаю дебагер. Сначала он создает new B (f:6) и переходит в строчку super(f1), при этом f1 у нас инициализируется 6, вроде все ок. Далее переходит в public A (int f1) и инициализирует f1 = 6, this.f1 пока = 0 (почему он переходит сначало в конструктор, вроде сначала должны инициализироваться нестатические переменные, а затем конструктор? ну даже это пока еще ок.
Далее он переходит private int f1 и инициализирует ее равно 7. При повторном нажатии эта строка превращается в f1 = 6, а this.а1 становится равной 7. Почему так происходит? Ведь в конструктор переданно значение 6. И почему private f1 стало равно 6?
Следующая строчка initialize, здесь f1 = 6, это значение private f1 или это значение this.f1 на 6 изменилось? Потому что в классе B в методе initialize выводится зачение 9, которое соответсятвует значению полученному из конструктора.
мне кажется, я совсем заблудилась в инициализациях переменных....
Если кто-то сможет доходчиво объяснить, буду очень благодарна, ну и конечно плюсик к вашей карме и пара баллов за помощь в решении))
public class Solution {
public static void main(String[] args) {
new B(6);
}
public static class A {
private int f1 = 7;
public A(int f1) {
this.f1 = f1;
initialize();
}
private void initialize() {
System.out.println(f1);
}
}
public static class B extends A {
protected int f1 = 3;
public B(int f1) {
super(f1);
this.f1 += f1;
initialize();
}
protected void initialize() {
System.out.println(f1);
}
}
}
Polina
29 уровень
не понятно как инициализируются переменные.
Решен
Комментарии (10)
- популярные
- новые
- старые
Для того, чтобы оставить комментарий Вы должны авторизоваться
Maxim Sheremet
10 февраля 2019, 16:29
Подскажите правильно я понял что метод с доступом protected мы переопределяем и всегда будет выполняться переопределленый метод класса В. Но если в родительском классе А сделать его private мы запрещаем его переопределять, что запускает его в родительском конструкторе?
+3
Polina
1 ноября 2018, 20:42
а что за строка выходит (рядом со строкой кода, зелеными буквами), когда, например построчно перехожу в дебагере в строку this.f1 = f1 (для public A(int f1)) - выдает Solution$A.f1: 7, f1: 6 и в блоке, variables выдает f1 = 6, this.f1 = 7? Почему this.f1 = 7?
0
HectorRey
1 ноября 2018, 20:56решение
Зеленый это то чему раны переменные на данный момент, когда дебаггер установлен на строку
то эта строка еще не выполнена, следовательно Solution$A.f1 (зелеными буквами) и переменная this.f1 в разделе variables равна 7, а переменная fi переданная в конструктор равна 6.
+3
Polina
1 ноября 2018, 21:31
то есть результат этой строки мы получаем, когда на следующую переходим, а там Solution$A.f1:6 и f1: 6, все логично теперь.
спасибо большое!
0
vinslerExpert
1 ноября 2018, 20:30полезный
в дебаггере есть еще кнопка чб проходить по строчно внутри функций, если запустить его по f9, он выполняется до точки останова, а если потом нажимать f8, то он будет заходить во все функции и построчно показывать их выполнение.
Наверное так, хотя может и напутал чего. )))
+3
Polina
1 ноября 2018, 20:50
Спасибо! Остался правда все равно вопрос именно почему this.f1 = 7, а а1 = 6 в дебагере(вопрос выше), я видимо не понимаю, как дебагер работает, может в этом причина.. что он подразумевает под this.f1, что под f1
0
Jonathan KorounetsРаботает в CyWat Technologies
22 ноября 2018, 14:19
с кодом выше вроде понятно, но что будет тут? Обрати внимание на 20 строку. почему результат будет "0 9"?
0
HectorRey
1 ноября 2018, 20:25полезный
1. Создаем объект используя конструктор
2. Компилятор заходит в класс B, передает в конструкторе переменную=6 и видит что класс B унаследован от класса А.
3. Переходит к классу А и так же ему в конструкторе передаем переменную=6.
4. В классе А видим что он явно не наследуется и поля из класса еще не проинициализированы, инициализируем
5. Возвращаемся к конструктору и выполняем строку
т.е. теперь поле f1 объекта класса А равен 6.
6. Вызываем метод
в классе А метод initialize() имеет модификатор доступа private следовательно реализацию мы будем брать именно из него, а не из класса B т.к. не переопределяется. Выполняется код внутри метода initialize()
На экран выводиться 6.
7. Возвращаемся к конструктору класса А, все выполнено, можно переходить к классу В.
8. Инициализируем поля из класса B
9. Возвращаемся к конструктору и выполняем строку
т.е. теперь поле f1 объекта класса B равен 3+6 = 9.
6. Вызываем метод
Выполняется код внутри метода initialize()
На экран выводиться 9.
+17
Polina
1 ноября 2018, 20:45
Спасибо, так понятнее, приблизительно так и представляла, что this.f1 должно инициализироваться 6, правда остался все равно вопрос выше.
0
Дина
14 ноября 2018, 14:53
стало гораздо понятнее, но можно вас еще спросить, почему "поле f1 объекта класса А равен 6." ? если в вашем 4м пункте мы в него занесли значение 7? и это вот "private int f1 = 7;" зачем тогда вообще?
+1