Можно ли в переменную класса-наследника присвоить ссылку на объекта базового класса?
Ответил, что можно при условии, что нужно выполнить явный каст. Опрос показал не верный ответ...
исправьте во втором вопросе, в варианте ответа:
Да, но нуЖно явно указать приведение типа (пропущена буква "ж").
В шестом вопросе так же неверное слово - Создать объекты абстрактного класса...
Для вызова родительского конструктора, методов либо обращение к родительским параметрам, измененным в потомке.
Вызов родительского конструктора полезен для исключения дублирования действий. Пример:
Без использования super пришлось бы заново описывать присвоение a и b.
Второй случай, когда нужно обратиться к параметру родительского класса, например при затирании его в потомке
И почему в переменную класса-наследника нельзя присвоить ссылку на объекта базового класса?
Я могу создать базовый класс Cat и класс-наследник Tiger в классе. В классе Tiger создаю переменную с типом Cat и спокойно передаю туда ссылка на объект класса-наследника
Так вы сами пишете "В классе Tiger создаю переменную с типом Cat и спокойно передаю туда ссылка на объект класса-наследника". А в вопросе спрашивается, а в вопросе "Можно ли в переменную класса-наследника присвоить ссылку на объект базового класса?"
На "слух", действительно, бывает сложно понять суть вопроса. Открываем IDE и сразу становится всё понятно:
// Tiger.java
class Cat {}
public class Tiger extends Cat {
public static void main(String[] args) {
System.out.println("Поехали...");
Tiger tiger = new Tiger(); // переменная наследника
Cat cat1 = new Cat(); // переменная базового класса
Cat cat2 = new Cat(); // переменная базового класса
cat1 = tiger; // так можно
// tiger = cat2; // если раскомментировать, то будет ошибка компиляции
tiger = (Tiger) cat2; // ошибка во время исполнения
// (строка "...приехали." не выведется, хоть код и скомпилируется)
System.out.println("...приехали.");
}
}
Что вообще не так с вопросом "Что не может дать инкапсуляция"?
Как по мне ответ про валидацию внутреннего состояния объекта и ответ с про контроль устанавливаемых значений кажется верным, но это не так
Все с ним как раз так. В этом вопросе нужно выбрать, что НЕ может дать инкапсуляция. Первые 3 варианта она может дать, а 4-й - нет, по этому 4-й и будет правильным ответом. Так что вам правльно кажется, что и валидация состояния и контроль значений подходят))
Согласен, варианты ответа какие-то воздушные и расплывчатые. В ступор вводят.
Типо ошибка компиляции...
Или внутренняя реализация класса... что вообще? причем здесь это.
Что нельзя делать с интерфейсом? (выберите неверное утверждение)
Погуглил и вроде бы можно создавать анонимный объект класса. Там есть new interfaceName()
вот здесь обсуждение этого случая
Мне кажется некорректным вопрос. Ну и опечаток тьма, не аккуратно..(
Вопрос корректен.
Вы правильно написали насчет анонимных классов. Анонимный класс != интерфейс. Такой вызов предполагает описания задекларированных методов интерфейса в месте инициализации. Т.е. создается не экземпляр интерфейса, а экземпляр анонимного класса, наследующего интерфейс. Поэтому нельзя просто создать:
publicinterfaceSomeInterface{publicvoidSomeMethod();}publicclassMyClass{...SomeInterface a =newSomeInterface();...}
Должно быть описано тело класса:
publicinterfaceSomeInterface{publicvoidSomeMethod();}publicclassMyClass{...SomeInterface a =newSomeInterface(){// это тело анонимного классаpublicvoidSomeMethod(){// здесь описывается реализация метода}...}}