Делаем правильный вывод

  • 12
  • Недоступна
У нас есть код. Но всё в нем не так… Нам нужно кое-что поменять. А именно — расставить обращения к методам суперкласса и модификаторы доступа так, чтобы получить вывод на экран определённого характера. Какого именно? Узнаете из задачи.
Вы не можете решать эту задачу, т.к. не залогинены.
Комментарии (122)
  • популярные
  • новые
  • старые
Для того, чтобы оставить комментарий вы должны авторизоваться
Jh-007 26 уровень, Kansk-City
около 5 часов назад
Блин, сидел тупил. Мне идея подсвечивает
Ambiguous method call: both 'B.method1()' and 'A.method1()' match
Даже не пытался откомпилировать, а валидатор принимает. По факту, это предупреждение IDEA, вдруг ты случайно поставил доступ private у класса-предка. IDEA предупреждает что это разные функции с одной сигнатурой.
Е К 20 уровень, Краснодар
15 января, 21:24
доступно разжевано по ссылке Спасибо Дмитрию Корнеенко - его пост самый первый по кнопке "популярные"
Kes Чайник в Банк
13 января, 18:34
Дополнительные нейронные связи в своей голове можно построить, если в main прописать:
System.out.println("Изначальный объект типа A");
A aa = new A(); aa.method1();
A ab = new B(); ab.method1();
A ac = new C(); ac.method1();

System.out.println("Изначальная объект типа B");
B bb = new B(); bb.method1();
B bc = new C(); bc.method1();

System.out.println("Изначальная объект типа C");
C cc = new C(); cc.method1();
Запускаем, получаем:
Изначальный объект типа A
A class, method1
B class, method1
C class, method1
Изначальная объект типа B
B class, method1
C class, method1
Изначальная объект типа C
C class, method1
У класса A меняем модификатор на private, получаем:
Изначальный объект типа A
A class, method1
A class, method1
A class, method1
Изначальная объект типа B
B class, method1
C class, method1
Изначальная объект типа C
C class, method1
Теперь еще и у класса B меняем модификатор на private, получаем:
Изначальный объект типа A
A class, method1
A class, method1
A class, method1
Изначальная объект типа B
B class, method1
B class, method1
Изначальная объект типа C
C class, method1
Dmitry Vasilyev 24 уровень, Саратов
18 декабря 2020, 16:24
Задача, действительно, классная. Обязательно - почитать про раннее и позднее связывание и совсем уже мастхев - слепить собственными руками код, который обыграет все варианты этих самых связываний. Ясное дело, что уже завтра всё это забудется, но хоть какой-то осадочек всё равно должен будет остаться )
AndyS 20 уровень, Москва
17 декабря 2020, 00:48
Поправьте, если неправильно понимаю итоговое решение задачи: 1. A a = new C() - создаём объект a, который будет иметь все методы класса A, но выполнять их так, как прописано в классе C. 2. Соответственно a.method2() вызывает метод method2() у класса С: "C class, method2". 3. super.method1() заставляет выполняться method1() у родительского класса С - т.е. у класса В. Этот метод хочет написать "B class, method1", но нам пока рано, поэтому перед вызовом этой строки надо вызвать некий метод родительского класса В - класса А. 4. Вызываем super.method2() - исполняется метод method2() класса А, выводит: "A class, method2". 5. Далее вызываем method1() этого же класса и выводим: "A class, method1". 6. Далее программа возвращается по стеку обратно в п. 3 и выводит "B class, method1", после чего завершается.
Kes Чайник в Банк
13 января, 18:31
Первый пункт - не верно. Выполнять их будет в зависимости от модификаторов родительских классов.
Е К 20 уровень, Краснодар
15 января, 21:03
В пункте 1 создаём экземпляр(объект) класса С, а вот ссылка на него имеет тип класса А, как прародитель)
Гракович Дмитрий Владимирович 26 уровень, Санкт-Петербург
3 декабря 2020, 07:32
не обращайте внимание на то что идея говорит о ошибке в super.method1(); все работает.
Павел студент на стероидах в Java Syntax Pro beta
19 декабря 2020, 17:27
А вот что это - ошибка IDEA, которая пропускает или не видит модификатор private для method1(); или что-то другое? Даже я это увидел и считал что если уж метод запривачен, то недоставайся ты никому. Но всё же оправил на компиляцию и запуск не смотря на светящуюся ошибку и всё прошо...
MR 22 уровень, Харьков
30 ноября 2020, 20:45
Писала код, думая, что я такая умная, что обалдеть как быстро тут все решу, а сама забыла уже, что в условии речь шла о суперклассах. Пока писала, случайно глянула на требования и поняла, что я ничерта правильно не пишу и память моя подвисает. Зависла потом надолго на том, что куда и как, но всё же подсматривала в требования... Но тем не менее не всё решение выложено в требования, думала я, потому что моя невнимательность сыграла тут вновь против меня, но я от этого только выиграла! Потому что я смотрела прямо в упор в требования, запуталась в них, но подумала, что они чето там неправильно написали, села и сама родила свой велосипед, проверила, обрадовалась какая я крутая. Пошла писать сюда свои вопросы, почему в требованиях какая-то херня и не подумала на тот момент, что раз прошло, то всё же норм и когда я это писала, решила пойти перечитать требования, перечитала, офигела... потом вернулась сюда, пишу об этом, и понимаю, что раз прошло, значит не фигня, офигела снова... Вывод: комментарий пишется слишком долго, кажется используется рекурсия, пользователь выбросил эксепшнс, мозги закрылись с ошибкой... Зачем здесь этот коммент? А он, сцуко, отражает всю суть задачи. А ещё просто хотела написать приколюху. И да, я изучаю программирование, кек.
Druha 28 уровень
21 ноября 2020, 21:34
пришел сюда написать комментарий о том какая офигенная задача. это самая лучшая задача из тех что я тут решал!!! Если бы хотя бы 10% из 600 с плюсом задач которых я до этого прорешал были бы такие же крутые первый раз решил эту задачу с комментированием строк [sout], но строки комментировать не нужно. небольшая подсказка: метод с индикатором доступа private выпадает из наследования
Evgeny Siganov 22 уровень, Москва
10 января, 12:21
"метод с индикатором доступа private выпадает из наследования" не совсем понял как это? В задаче
private void method1()
нужен чтобы обратившись из
public void method2() {
            System.out.println("A class, method2");
            method1();
        }
класса А мы вызвали именно этот private метод класса А, а не переопределённый класса С
Ягодин Артем Романович 22 уровень, Москва
16 ноября 2020, 13:12
первый раз такое, что с красной ошибкой код скомпилировался о-о
Pig Man Главная свинья в Свинарнике
15 ноября 2020, 19:09
Ну надо же, две недели эта страница висела у меня открытой, все думал "надо будет почитать". Жаль, что я все же этого не сделал до этой задачи, было бы проще. Различия между ранним и поздним связыванием. То, что записал для своего понимания: Связывание определяет то, какой метод будет вызван в случае, если в поле видимости JVM будет несколько переопределенных или перегруженных методов. Ранее/статическое связывание — используется для разрешения перегруженных методов. Все приватные, статические и final методы разрешаются при помощи статического связывания, поскольку их нельзя переопределять. То, какой метод будет вызван, решается типом переменной, а не объектом, который в нее переданного Позднее/динамическое связывание - используется для разрешения переопределенных методов. Все виртуальные методы (это методы нестатические и без ключевого слова final. Все методы по умолчанию являются виртуальными) разрешаются при помощи динамического связывания
A a = new C();
То есть, как правило тип переменной (в конкретном случае А) содержит в себе информацию о том, какие имена полей, методов и вложенных классов будут доступны из нее, но не содержит их реализацию, которая будет взята из переданного объекта в эту переменную (в конкретном случае C). Но в случае, если у класса типа переменной присутствуют статические или final методы, поля, классы, то так как их все равно нельзя переопределить, то они в любом случае должны быть доступны из этой переменной, поэтому происходит ранее связывание. Не знаю, можно ли так описать этот процесс, но я его понял так