Может ли быть конструктор у абстрактного класса для чего java
Какой смысл создавать конструктор для абстрактного класса в Java?
Я хотел бы знать, какой цели служит конструктор для абстрактного класса; поскольку мы не создаем экземпляры абстрактных классов, зачем нам вообще нужен такой конструктор?
8 ответов
будут времена, когда у вас будет некоторая общая инициализация переменных экземпляра, которые необходимо настроить всем наследующим классам. Вы создаете экземпляр абстрактного класса при его расширении, и этот конкретный класс имеет конструктор, который будет либо предоставлять параметры конструктору абстрактного класса.
Они все еще могут вызываться конструкторами классов, которые наследуют от этого, что делает рефакторинг кода хорошим использованием для наличия конструктора в абстрактном классе.
Если у вас есть неинициализированные конечные поля в абстрактном классе, вам нужно будет инициализировать их в конструкторе.
Если ваш класс не объявляет конструктор, javac сделает для вас конструктор no-arg, do-nothing. Затем, когда ваш подкласс инициализирован, он вызовет сгенерированный конструктор no-op, и жизнь хороша.
однако, если ваш класс объявляет любой конструктор, javac не сделает его для вас. В этом случае, конструктор подкласса должен явно вызвать конструктор родительского класса. В противном случае вам не удастся инициализировать членов родительского класса, как указано выше ответ упоминает.
конструкторы для абстрактных классов используются подклассами (вызываются из конструкторов подклассов с помощью super(params) ).
вы должны сделать эти конструкторы protected чтобы внести ясность.
вы не создаете абстрактные классы, но конструктор вызывается при создании экземпляра подкласса.
использование может быть для инициализации общих атрибутов ie.
де-дублирование общих знаний / поведения.
Я согласен, конструкторы создаются при условии, что будут экземпляры. Если у вас много общего кода, Вы можете подумать о создании конструктора, но гораздо лучше поместить его в init() метод.
BestProg
Содержание
Поиск на других ресурсах:
1. Что такое абстрактный класс? Назначение абстрактных классов. Общая форма. Ключевое слово abstract
Абстрактный класс – это класс, содержащий методы, которые не имеют реализации. Абстрактный класс создается с целью создания общего интерфейса между разными реализациями классов, которые будут производными от абстрактного класса. Абстрактный класс создается для определения некоторых общих черт производных от него классов, которые определяют конкретную его реализацию.
Запрещено (нет смысла) создавать объект абстрактного класса.
Общая форма объявления абстрактного класса следующая:
2. Что такое абстрактный метод? Общая форма
Если некоторый класс есть унаследованным от абстрактного, то этот класс должен переопределить все абстрактные методы базового абстрактного класса. В противном случае будет сгенерирована ошибка.
Общая форма объявления абстрактного метода в абстрактном классе имеет следующий вид:
В иерархии наследования (расширения) классов, абстрактные методы являются чем-то общим. Конкретные реализации абстрактных методов помещаются классах, унаследованных от абстрактных классов.
3. Схематическое изображение объявления и использования абстрактного метода в абстрактном классе. Пример
Рисунок. Схема взаимодействия между абстрактным классом и производными классами в Java
4. Пример, который демонстрирует использование абстрактных классов
В классе Figure объявляются:
В классе Triangle() реализованы:
В результате выполнения функции main() класса UseAbstractClass будет выведен следующий результат:
5. Объяснение к примеру из пункта 4
Объяснение к примеру (см. предшествующий пункт) в виде вопросов.
5.1. Зачем в классе Figure методы Area() и ShowName() объявляются абстрактными?
5.2. Почему класс Figure объявляется абстрактным?
5.3. Почему в классе Figure методы Area() и ShowName() не содержат кода реализации (тела метода)?
Если в абстрактном классе метод объявлен как абстрактный (с ключевым словом abstract ), то этот метод не должен содержать реализации (согласно синтаксису Java). Это поясняется тем, что вызов этого метода не имеет смысла.
5.4. Можно ли в абстрактном классе Figure добавлять другие не абстрактные методы?
Да, можно. Абстрактный класс может содержать не абстрактные методы (в отличие от интерфейса ).
Нет, нельзя. То есть, следующая строка
есть ошибкой компилятора Java: «Cannot instantiate the type Figure».
Метод GetArea() получает ссылку с именем f абстрактного класса Figure, который есть базовым в иерархии классов (из класса Figure унаследованы два класса Triangle и Circle).
Затем по ссылке вызывается метод Area() в строке
В функции main() при вызове метода GetArea()
Точно таким же способом связывается экземпляр f2 класса Circle с обобщенной ссылкой f в методе GetArea()
6. Можно ли в абстрактном классе объявлять методы, которые имеют реализацию (тело)?
Да, можно. Абстрактный класс допускает реализацию не абстрактных методов.
7. Пример создания иерархии абстрактных классов
Пример. Ниже приведен пример иерархии абстрактных классов
Использование класса C может быть, например следующим
8. Может ли абстрактный класс не содержать абстрактных методов?
Да, может. Это необходимо в случаях, когда абстрактные методы в классе не нужны, но нужно запретить создание экземпляров этого класса.
9. Какие отличия между использованием абстрактных классов и использованием интерфейсов?
Между абстрактными классами и интерфейсами существуют следующие отличия:
10. Преимущества использования абстрактных классов
Использование абстрактных классов дает следующие преимущества:
Абстрактные классы и методы
Класс, содержащий абстрактные методы, называется абстрактным классом. Такие классы помечаются ключевым словом abstract.
Абстрактный метод не завершён. Он состоит только из объявления и не имеет тела:
По сути, мы создаём шаблон метода. Например, можно создать абстрактный метод для вычисления площади фигуры в абстрактном классе Фигура. А все другие производные классы от главного класса могут уже реализовать свой код для готового метода. Ведь площадь у прямоугольника и треугольника вычисляется по разным алгоритмам и универсального метода не существует.
Если вы объявляете класс, производный от абстрактного класса, но хотите иметь возможность создания объектов нового типа, вам придётся предоставить определения для всех абстрактных методов базового класса. Если этого не сделать, производный класс тоже останется абстрактным, и компилятор заставит пометить новый класс ключевым словом abstract.
Можно создавать класс с ключевым словом abstract даже, если в нем не имеется ни одного абстрактного метода. Это бывает полезным в ситуациях, где в классе абстрактные методы просто не нужны, но необходимо запретить создание экземпляров этого класса.
В тоже время абстрактный класс не обязательно должен иметь только абстрактные методы. Напомню ещё раз, что если класс содержит хотя бы один абстрактный метод, то он обязан быть сам абстрактным.
Создавать объект на основе абстрактного класса нельзя.
Абстрактный класс не может содержать какие-либо объекты, а также абстрактные конструкторы и абстрактные статические методы. Любой подкласс абстрактного класса должен либо реализовать все абстрактные методы суперкласса, либо сам быть объявлен абстрактным. Короче, я сам запутался. Пойду лучше кота поглажу.
Я вернулся. Давайте напишем пример для абстрактного класса.
Допустим, мы хотим создать абстрактный класс СферическийКонь и не менее идиотский класс СферическийКоньВВакууме, наследующий от первого класса.
Когда вы напишете такой код, то студия подчеркнёт второй класс красной волнистой линией и предложит реализовать обязательный метод, который определён в абстрактном классе.
Соглашаемся и дописываем в созданную заготовку свой код для метода.
В главной активности напишем код для щелчка кнопки.
Обратите внимание, что абстрактный класс может содержать не только абстрактные, но и обычные методы.
Раннее мы создавали класс Фигура, у которого был метод вычисления площади фигуры. Метод ничего не делал, так как невозможно вычислить площадь неизвестной фигуры. Поэтому, этот метод можно сделать абстрактным, а в классах, производных от Фигуры, переопределить данный метод.
Вам вряд ли придётся часто создавать абстрактные классы для своих приложений, но встречаться с ними вы будете постоянно, например, классы AsyncTask, Service и др.
Может ли абстрактный класс иметь конструктор?
абстрактный класс может иметь конструктор?
Если да, то как его можно использовать и для каких целей?
21 ответов:
да, абстрактный класс может иметь конструктор. Рассмотрим это:
суперкласс Product является абстрактным и имеет конструктор. Конкретный класс TimesTwo имеет конструктор, который просто жестко кодирует значение 2. Конкретный класс TimesWhat имеет конструктор, который позволяет звонящему указать значение.
абстрактные конструкторы часто используются для применения ограничений класса или инвариантов, таких как минимальные поля, необходимые для установки класс.
Примечание: поскольку нет конструктора по умолчанию (или no-arg) в родительском элементе абстрактный класс, конструктор, используемый в подклассе должен явно вызывать родительский конструктор.
вы определите конструктор в абстрактном классе, если вы находитесь в одной из следующих ситуаций:
в любом случае, не забывайте, что если вы не определите конструктор, затем компилятор автоматически сгенерирует его для вас (этот является общедоступным, не имеет аргумента и ничего не делает).
Да, он может иметь конструктор, и он определен и ведет себя так же, как конструктор любого другого класса. За исключением того, что абстрактные классы не могут быть непосредственно созданы, только расширены, поэтому использование всегда происходит из конструктора подкласса.
да! абстрактные классы могут иметь конструкторы!
Да, когда мы определяем класс как абстрактный класс, он не может быть создан, но это не означает, что абстрактный класс не может иметь конструктор. Каждый абстрактный класс должен иметь конкретный подкласс, который будет реализовывать абстрактные методы, что абстрактный класс.
при создании объекта любого подкласса все конструкторы в соответствующем дереве наследования вызываются в подход сверху вниз. То же самое относится и к абстрактным классам. Хотя мы не можем создать объект абстрактного класса, когда мы создаем объект класса, который является конкретным и подкласс абстрактного класса, конструктор абстрактного класса вызывается автоматически. Следовательно, мы можем иметь конструктор в абстрактных классах.
Примечание: не-абстрактный класс может иметь абстрактные методы, но абстрактный класс может иметь неабстрактный метод. Причина подобна тому из конструкторы, разница в том, что вместо автоматического вызова мы можем вызвать super (). Кроме того, нет ничего похожего на абстрактный конструктор, поскольку это вообще не имеет смысла.
не только может, он всегда так делает. Если вы не укажете один, то он имеет конструктор arg по умолчанию, как и любой другой класс. Фактически, все классы, включая вложенные и анонимные классы, получат конструктор по умолчанию, если он не указан (в случае анонимных классов невозможно указать один, поэтому вы всегда получите конструктор по умолчанию).
хорошим примером абстрактного класса с конструктором является календарь класса. Вы получаете Объект календаря путем вызова календаря.getInstance (), но он также имеет конструкторы, которые защищены. Причина, по которой его конструкторы защищены, заключается в том, что только его подклассы могут вызывать их (или классы в одном пакете, но поскольку он абстрактен, это не применяется). GregorianCalendar является примером класса, который расширяет календарь.
Да, это может быть, абстрактные конструкторы классов обычно используются для супер-вызовов событий инициализации, общих для всех подклассов
абстрактный класс может иметь конструктор, но вы не можете создать объект абстрактного класса, так как вы можете использовать этот конструктор?
дело в том, что когда вы наследуете этот абстрактный класс в своем подклассе, вы можете передавать значения его(абстрактного) конструктора через метод super(value) в своем подклассе, и нет, вы не наследуете конструктор.
таким образом, используя super вы можете передавать значения в конструкторе абстрактного класса и, насколько я помню, он должен быть первым оператор в вашем методе или конструкторе.
хотя есть много хороших ответов, я хотел бы дать мои 2 цента.
конструктор НЕ СТРОИТ ОБЪЕКТ. Он используется для инициализации объекта.
абстрактный класс (В отличие от интерфейса) могут иметь неокончательные нестатические поля, которые нуждаются в инициализации. Вы можете написать свой собственный конструктор в абстрактном классе, чтобы сделать это. Но, в этом случае, не будет никакого конструктора по умолчанию.
будьте осторожны при расширении выше абстрактного класса, вы должны явно вызвать super из каждого конструктора. Первая строка любого конструктора вызывает super (). если вы явно не вызываете super (), Java сделает это за вас. Ниже код не будет компилироваться:
у вас есть чтобы использовать его, как показано ниже пример:
суперкласс является абстрактным и имеет конструктор.
конечно, абстрактный класс может иметь конструктор.Обычно конструктор класса используется для инициализации fields.So, абстрактный конструктор класса используется для инициализации полей абстрактного класса. Вы можете предоставить конструктор для абстрактного класса, если хотите инициализировать определенные поля абстрактного класса до создания экземпляра дочернего класса. Абстрактный конструктор класса также может быть использован для выполнения кода, относящегося к каждому дочернему классу. Это предотвращает код дублирование.
мы не можем создать экземпляр абстрактного класса, но мы можем создать экземпляры классов, которые являются производными от абстрактного класса. Таким образом, при создании экземпляра производного класса автоматически вызывается родительский конструктор абстрактного класса.
в конкретном классе объявление конструктора для конкретного типа Fnord эффективно предоставляет две вещи:
средство, с помощью которого код может запросить создание экземпляра Fnord
средство, с помощью которого экземпляр типа, производного от Fnord который находится в стадии разработки может запросить, чтобы все функции базового класса были инициализированы.
хотя, возможно, должны быть средства, с помощью которых эти две способности могут быть контролируемый отдельно, для каждого конкретного типа одно определение позволит. Хотя первая способность не имеет значения для абстрактного класса, вторая способность имеет такое же значение для абстрактного класса, как и для любого другого, и поэтому ее объявление так же необходимо и полезно.
Может ли абстрактный класс иметь конструктор?
Может ли абстрактный класс иметь конструктор?
Если да, то как его можно использовать и для каких целей?
22 ответа
Да, у абстрактного класса может быть конструктор. Учти это:
Суперкласс Product является абстрактным и имеет конструктор. Конкретный класс TimesTwo имеет конструктор, который просто жестко кодирует значение 2. Конкретный класс TimesWhat имеет конструктор, который позволяет вызывающей стороне указывать значение.
Абстрактные конструкторы часто используются для обеспечения соблюдения ограничений или инвариантов класса, таких как минимальное количество полей, необходимых для настройки класса.
ПРИМЕЧАНИЕ. Поскольку в родительском абстрактном классе нет конструктора по умолчанию (или без аргумента), конструктор, используемый в подклассе, должен явно вызывать родительский конструктор.
Вы должны определить конструктор в абстрактном классе, если вы находитесь в одной из следующих ситуаций:
Обратите внимание, что:
В любом случае не забывайте, что если вы не определяете конструктор, компилятор автоматически сгенерирует его для вас (он общедоступен, не имеет аргументов и ничего не делает).
Мало того, что это возможно, так бывает всегда. Если вы не укажете его, по умолчанию он не имеет конструктора arg, как и любой другой класс. Фактически, ВСЕ классы, включая вложенные и анонимные классы, получат конструктор по умолчанию, если он не указан (в случае анонимных классов его невозможно указать, поэтому вы всегда получите конструктор по умолчанию).
Хорошим примером абстрактного класса, имеющего конструктор, является Calendar класс. Вы получаете объект Calendar, вызывая Calendar.getInstance (), но у него также есть защищенные конструкторы. Причина, по которой его конструкторы защищены, заключается в том, что их могут вызывать только его подклассы (или классы в том же пакете, но поскольку он абстрактный, это не применимо). GregorianCalendar является пример класса, расширяющего Calendar.
У абстрактного класса может быть конструктор, НО вы не можете создать объект абстрактного класса, так как вы используете этот конструктор?
Дело в том, что когда вы наследуете этот абстрактный класс в своем подклассе, вы можете передавать значения его (абстрактному) конструктору с помощью метода super (value) в своем подклассе, и вы не наследуете конструктор.
Поэтому, используя super, вы можете передавать значения в конструктор абстрактного класса, и, насколько я помню, он должен быть первым оператором в вашем методе или конструкторе.
Да, может, конструкторы абстрактных классов обычно используются для супервызовов для событий инициализации, общих для всех подклассов.
Конечно, абстрактный класс может иметь конструктор. Обычно конструктор класса используется для инициализации полей. Таким образом, конструктор абстрактного класса используется для инициализации полей абстрактного класса. Вы должны предоставить конструктор для абстрактного класса, если хотите инициализировать определенные поля абстрактного класса до создания экземпляра дочернего класса. Конструктор абстрактного класса также может использоваться для выполнения кода, актуального для каждого дочернего класса. Это предотвращает дублирование кода.
Мы не можем создать экземпляр абстрактного класса, но мы можем создать экземпляры классов, которые являются производными от абстрактного класса. Итак, когда создается экземпляр производного класса, автоматически вызывается конструктор родительского абстрактного класса.
Да, абстрактные классы могут иметь конструкторы!
Вот пример использования конструктора в абстрактном классе:
Думаю, вы получили ответ.
Суперкласс является абстрактным и имеет конструктор.
Как описано здесь javafuns, это пример:
В конкретном классе объявление конструктора для конкретного типа Fnord эффективно раскрывает две вещи:
Средство, с помощью которого код может запросить создание экземпляра Fnord.
Хотя, возможно, должны быть средства, с помощью которых можно было бы управлять этими двумя способностями по отдельности, для каждого конкретного типа одно определение разрешит обе. Хотя первая способность не имеет смысла для абстрактного класса, вторая способность столь же значима для абстрактного класса, как и для любого другого, и поэтому ее объявление столь же необходимо и полезно.
Да, это так. А конструктор абстрактного класса вызывается при создании экземпляра унаследованного класса. Например, ниже представлена действующая программа на Java.
Это результат приведенного выше кода,
Вызывается базовый конструктор Вызывается производный конструктор
Поскольку абстрактный класс может иметь переменные всех модификаторов доступа, они должны быть инициализированы значениями по умолчанию, поэтому конструктор необходим. Когда вы создаете экземпляр дочернего класса, вызывается конструктор абстрактного класса и инициализируются переменные.
Напротив, интерфейс действительно содержит только постоянные переменные, что означает, что они уже инициализированы. Так что интерфейсу не нужен конструктор.
Для создания цепочки конструкторов у абстрактного класса будет конструктор. Компилятор сохраняет оператор Super () внутри конструктора подкласса, который вызывает конструктор суперкласса. Если бы не было конструкторов для абстрактных классов, тогда нарушались бы правила Java, и мы не могли добиться объединения конструкторов.
Да, конечно, вы можете добавить один, как уже упоминалось для инициализации переменных абстрактного класса. НО, если вы не объявляете его явно, у него в любом случае есть неявный конструктор для работы «Constructor Chaining».
Открытый класс AbstractClassConstructor <
Да, у него может быть конструктор, и он определен и ведет себя так же, как конструктор любого другого класса. За исключением того, что абстрактные классы не могут быть созданы напрямую, а только расширены, поэтому использование всегда происходит из конструктора подкласса.
Абстрактный класс может иметь конструктор, но не может быть создан. Но конструктор, определенный в абстрактном классе, может использоваться для создания экземпляра конкретного класса этого абстрактного класса. Проверьте JLS:
Подкласс абстрактного класса, который сам не является абстрактным, может быть создан, что приведет к выполнению конструктора абстрактного класса и, следовательно, выполнению инициализаторов полей для переменных экземпляра этого класса.
Да, когда мы определяем класс как абстрактный класс, он не может быть создан, но это не означает, что абстрактный класс не может иметь конструктора. Каждый абстрактный класс должен иметь конкретный подкласс, который будет реализовывать абстрактные методы этого абстрактного класса.
Когда мы создаем объект любого подкласса, все конструкторы в соответствующем дереве наследования вызываются сверху вниз. Тот же случай применяется к абстрактным классам. Хотя мы не можем создать объект абстрактного класса, когда мы создаем объект класса, который является конкретным и подклассом абстрактного класса, конструктор абстрактного класса вызывается автоматически. Следовательно, у нас может быть конструктор в абстрактных классах.
Примечание. Неабстрактный класс не может иметь абстрактных методов, но абстрактный класс может иметь неабстрактный метод. Причина похожа на конструкторы, разница в том, что вместо автоматического вызова мы можем вызвать super (). Кроме того, нет ничего лучше абстрактного конструктора, поскольку он вообще не имеет смысла.