abstract class A {
int p1;
A() {
p1 = 1;
}
void print() {
System.out.println(p1);
}
}
Является ли p1 объектом, и можно ли его будет использовать дальше?
Конструкторы А и принт использовать дальше нельзя, потмоу что объектыOleg Zaytsev
24 уровень
Объект
Решен
Комментарии (10)
- популярные
- новые
- старые
Для того, чтобы оставить комментарий Вы должны авторизоваться
Сергеев ВикторMaster
7 марта 2019, 17:44
p1 это переменная
переменные ссылаются на объект. Это просто имя чтобы обращаться к конкретному объекту.
В вашем случае переменная ещё и примитив, т.е. она содержит не ссылку на объект, а примитивное число.
В общем использовать дальше можно, либо конкретизируйте вопрос.
0
Oleg Zaytsev
7 марта 2019, 18:16
Да, переменные можно использовать, но не напрямую. В этой программе используются методы абстрактного класса. Для этого используется привидение объекта об2 к об1, а об1 в А и запускается конструктор А()..
Т.е. методы все таки можно использовать через какое-то привидение. Получается абстрактный класс какой - то недокласс, котоырй можно использовать толко через приведение лоул
0
Сергеев ВикторMaster
7 марта 2019, 18:23
наследник (B) знает обо всех методах родителя (A) поэтому в приведение типов здесь излишне. Конструктор вызывается не во время приведения типов, а в момент создания объекта B. Если вы посмотрите на код, который дописал компилятор, то увидите у класса В конструктор, который вызывает конструктор А
Абстрактный класс нужен, чтобы выделить общую логику и обеспечить полиморфизм, т.е. не зависеть от реализации
+1
Oleg Zaytsev
7 марта 2019, 18:41
я запутался
это тут вызывается метод А()?
он же пустой
если он пустой то в нем используются методы клааса А?
зачем тогда он нужен?
без приведения не будет же использвоаться класс А, он же абстрактный 0
Сергеев ВикторMaster
7 марта 2019, 18:46
не метода А() а конструктор, да тут он вызывается.
Пустой он потому что вы туда ничего не написали. Если в классе не определен ни один конструктор, то компилятор допишет дефолтный (пустой с вызовом родителя).
Сам класс пустой, но он наследует класс А и все его свойства и методы.
Зачему нужен, я хз, вы же его написали.
Без приведения будет работать. Т.е. такой вызов возможен
+1
Oleg Zaytsev
7 марта 2019, 22:17
Вы умнее чем учитель МГУ
читал - абстрактный значит другие не могут вызывать его методы, думаю зачем он нужен. Дальше - если сделать привидение то можно использовать ЛУЛ
втфмзфк
Получается чтобы использовать абстрактный метод, нужно создать класс который является его потомком и через потом вызывать необходимые функции? Зачем тогда он нужен, не проще создать простой класс без потомков?
0
Сергеев ВикторMaster
7 марта 2019, 23:09
абстрактный метод это немного другое.
Да вызвать метод абстрактного класса может любой наследник.
Зачем? Например есть класс по генерации тестовых данных. Их после теста надо удалить и это однотипная операция. Получается несколько вариантов:
- в каждом из 50 классов написать одно и тоже
- вынести в родительский класс и использовать наследование
- другие варианты
в первом есть проблема, если логика поменяется, надо будет изменить её во всех 50 классах. Второй вариант удобнее, логика в одном месте, менять проще.
+1
Oleg Zaytsev
8 марта 2019, 13:57
Спасибо, запомню.
0
Oleg Zaytsev
8 марта 2019, 14:46
А почему мы не можем создать обычный класс и обращаться к нему за тестовыми данными?
0
Сергеев ВикторMaster
8 марта 2019, 16:50
можем. В моем примере именно операция удаления однотипная. Писать её 50 раз нет смысла
0