Баг в initializeIdAndName

  • 8
  • Недоступна
Что-то не так в этом коде! Ваша задача — поправить программу, чтобы она компилировалась и работала. Для начала разберитесь, что работает неправильно и вынесите реализацию метода initializeIdAndName в класс User. При этом initializeIdAndName в классе User должен возвращать тип User.
Вы не можете решать эту задачу, т.к. не залогинены.
Комментарии (176)
  • популярные
  • новые
  • старые
Для того, чтобы оставить комментарий Вы должны авторизоваться
Ant
Уровень 24
18 октября, 13:00
Если кто забыл (а я один из них 😁) При переопределении разрешается: 1. расширить область видимости (модификаторы доступа) 2. сузить тип возвращаемого значения по наследованию
Pavel V.
Уровень 35
30 августа, 03:15
ВНЕЗАПНО решилась, хотя до этого 3 раза решение обнулял, когда делал непонятно что. Как оказалось, решается буквально за 5 кликов.
Алтын
Уровень 26
30 июля, 12:37
Не вздумайте делать поля приватными
Jet
Уровень 24
9 июля, 23:54
DBObject initializeIdAndName(long id, String name);
Petr Sushilin
Уровень 33
8 апреля, 13:04
Переформулируйте требования к задаче - создавал новый класс (файл) User...
Anonymous #2705033
Уровень 15
11 февраля, 16:14
Метод интерфейса DBObject имплементируется в классе User. Это все
Edward Morgan
Уровень 30
22 января, 11:45
Мы МОЖЕМ "менять" в перезаписанных методах тип DBObject на User потому что User - это DBObject (User is a DBObject). Помните примеры где создавался класс Animal, а потом класс Cow extends Animal ? Мы потом еще могли создавать корову так:
Cow cow = new Cow();
А могли переменной суперкласса:
Animal animal = new Cow();
Мы так можем делать потому что между Animal и Cow "is-a" связь. "Сow is an Animal" (Корова это Животное), НО ЖИВОТНОЕ НЕ ВСЕГДА КОРОВА! (Animal is NOT a Cow) т.к. Животное может быть свиньей, петухом, медведем, зайцем, педофилом, политиком, белкой и т.д. Когда в программе видите код типо:
public class Cow extends Animal
- заменяйте в уме слово "extends" на "is a" и читайте Сow is an Animal. С интерфейсами такая же штука т.к. implements это по сути тот же extends:
class User implements DBObject
Как читаем?
User is a DBObject
Что мы из этого сразу в голове себе должны разложить по полочкам? Следующее: 1) Везде, во всех методах где есть DBObject - можно вписать User (но НЕ наоборот, потому что User is a DBObject НО DBObject не всегда User (Животное - не всегда корова). Пример:
public void killAnimal( Animal a){
//Какой-то код
}
//и используя этот метод мы можем в его параметры вставить Cow
Cow cow = new Cow();
killAnimal(cow);
2) Исходя из логики пункта 1 мы так же можем писать
DBObject dbobject = new User();
и
User user = new User();
Но учтите, что при написании первого варианта вы можете использовать только те методы которые есть в интерфейсе DBObject.
Aleksei Reinsalu
Уровень 19
28 декабря 2021, 10:20
Поскольку знания еще слабые пришлось себя проверять. Первоисточник подтвердил, что интерфейс это ссылочный тип. Много деталей, которые сразу все выучить трудно. Но этот тонкий нюанс все же выучил. Интерфейс может служить названием/ссылкой для объекта применяющего класса. Это объясняет почему ответ на вопрос "можно ли создавать объекты интерфейса" звучит как "напрямую нельзя, но.." а не просто "нет".
sts
Уровень 13
20 февраля, 12:18
Меня тоже мучал вопрос о создании объектов интерфейса) Вот короткая статья об интерфейсах на русском. Может кому-то поможет.
Sasha Dokuchaev Работает в Andersen
17 декабря 2021, 10:36
Сложно, но IDEA умница, помогает понять, что к чему
Neonila Kravtcova
Уровень 19
6 декабря 2021, 22:37
Не знала, что при реализации метода, заявленного в интерфейсе, в классе мы можем изменить тип значения, возвращаемого этим методом.
Darya Hom
Уровень 32
4 января, 19:03
Да, вот тут было, что у переопределённого метода должен быть тот же тип возвращаемого значения. Непонятно(
Edward Morgan
Уровень 30
22 января, 11:44
Мы МОЖЕМ "менять" в перезаписанных методах тип DBObject на User потому что User - это DBObject (User is a DBObject). Помните примеры где создавался класс Animal, а потом класс Cow extends Animal ? Мы потом еще могли создавать корову так:
Cow cow = new Cow();
А могли переменной суперкласса:
Animal animal = new Cow();
Мы так можем делать потому что между Animal и Cow "is-a" связь. "Сow is an Animal" (Корова это Животное), НО ЖИВОТНОЕ НЕ ВСЕГДА КОРОВА! (Animal is NOT a Cow) т.к. Животное может быть свиньей, петухом, медведем, зайцем, педофилом, политиком, белкой и т.д. Когда в программе видите код типо:
public class Cow extends Animal
- заменяйте в уме слово "extends" на "is a" и читайте Сow is an Animal. С интерфейсами такая же штука т.к. implements это по сути тот же extends:
class User implements DBObject
Как читаем?
User is a DBObject
Что мы из этого сразу в голове себе должны разложить по полочкам? Следующее: 1) Везде, во всех методах где есть DBObject - можно вписать User (но НЕ наоборот, потому что User is a DBObject НО DBObject не всегда User (Животное - не всегда корова). Пример:
public void killAnimal( Animal a){
//Како-то код
}
//и используя этот метод мы можем в его параметры вставить Cow
Cow cow = new Cow();
killAnimal(cow);
2) Исходя из логики пункта 1 мы так же можем писать
DBObject dbobject = new User();
и
User user = new User();
Но учтите, что при написании первого варианта вы можете использовать только те методы которые есть в интерфейсе DBObject.