java зачем абстрактному классу конструктор

Зачем мне нужен конструктор в абстрактном классе?

В настоящее время я прорабатываю руководство по java, где меня знакомят с абстрактными классами и тестированием с помощью J-Unit.

СПОРТСМЕН

БИКЕРТЕСТ

Теперь, когда мои файлы и код работают (они взяты из приведенного примера), я не могу понять, почему они работают, поскольку в учебнике не подробно рассказывается о том, как выполняется тест.

QN1 Зачем мне нужен конструктор в абстрактном классе AthleteTest? Насколько я понимаю, поскольку он является абстрактным, он не будет создан, поэтому конструктор не нужен, поскольку конструкторы вступают в игру только при создании экземпляра класса.

QN2 Как проходит тестирование; каков порядок тестирования? Например, когда я запускаю BikerTest и переопределяю классы GetAthlete и GetExplicitAthlete, я на самом деле не запускаю методы в коде. Но почему именно тогда, когда я запускаю код, методы запускаются. JUnit просто запускает все методы по умолчанию?

Заранее благодарим за любые разъяснения и объяснения!

3 ответа

Зачем мне нужен конструктор в абстрактном классе AthleteTest? понимание состоит в том, что, поскольку это абстрактно, это не будет создан, поэтому в конструкторе нет необходимости. конструкторы вступают в игру только при создании экземпляра класса.

Как проходит тестирование; каков порядок тестирования? Для Например, когда я запускаю BikerTest, я переопределяю GetAthlete и GetExplicitAthlete, я фактически не запускаю методы в код, но почему когда я запускаю код, методы запускаются. Делает JUnit просто запускает все методы по умолчанию?

Вы можете использовать и другие аннотации, например @BeforeClass и @AfterClass.

Конструктор в абстрактном классе может использоваться для инициализации вашего класса, например, если вы используете атрибут final. А конструктор из вашего подкласса может вызывать один конструктор абстрактного класса.

Зачем мне нужен конструктор в абстрактном классе AthleteTest? Я понимаю, что, поскольку он абстрактный, он не будет создан

Верно. Невозможно создать экземпляр абстрактного класса. Хотя это не означает, что абстрактные классы не могут иметь конструкторов. Если вы не добавляете конструктор в класс, компилятор добавит для вас конструктор без аргументов по умолчанию. Это верно и для абстрактных классов. Кроме того, каждый конструктор в Java имеет неявный вызов super() в качестве первой строки, которая вызывает конструктор родительского класса (включая конструктор по умолчанию, добавленный компилятором). В вашем примере BikerTest не имеет явного конструктора. Поэтому компилятор добавит в класс BikerTest следующий конструктор:

Например, когда я запускаю BikerTest и переопределяю классы GetAthlete и GetExplicitAthlete, я на самом деле не запускаю методы в коде, но почему, когда я запускаю код, методы запускаются

Источник

Какой смысл создавать конструктор для абстрактного класса в Java?

Я хотел бы знать, какой цели служит конструктор для абстрактного класса; поскольку мы не создаем экземпляры абстрактных классов, зачем нам вообще нужен такой конструктор?

8 ответов

будут времена, когда у вас будет некоторая общая инициализация переменных экземпляра, которые необходимо настроить всем наследующим классам. Вы создаете экземпляр абстрактного класса при его расширении, и этот конкретный класс имеет конструктор, который будет либо предоставлять параметры конструктору абстрактного класса.

Они все еще могут вызываться конструкторами классов, которые наследуют от этого, что делает рефакторинг кода хорошим использованием для наличия конструктора в абстрактном классе.

Если у вас есть неинициализированные конечные поля в абстрактном классе, вам нужно будет инициализировать их в конструкторе.

Если ваш класс не объявляет конструктор, javac сделает для вас конструктор no-arg, do-nothing. Затем, когда ваш подкласс инициализирован, он вызовет сгенерированный конструктор no-op, и жизнь хороша.

однако, если ваш класс объявляет любой конструктор, javac не сделает его для вас. В этом случае, конструктор подкласса должен явно вызвать конструктор родительского класса. В противном случае вам не удастся инициализировать членов родительского класса, как указано выше ответ упоминает.

конструкторы для абстрактных классов используются подклассами (вызываются из конструкторов подклассов с помощью super(params) ).

вы должны сделать эти конструкторы protected чтобы внести ясность.

вы не создаете абстрактные классы, но конструктор вызывается при создании экземпляра подкласса.

использование может быть для инициализации общих атрибутов ie.

де-дублирование общих знаний / поведения.

Я согласен, конструкторы создаются при условии, что будут экземпляры. Если у вас много общего кода, Вы можете подумать о создании конструктора, но гораздо лучше поместить его в init() метод.

Источник

Собеседование по Java — ООП (вопросы и ответы). Часть 2

Вторая часть ответов и вопросов для собеседования по ООП в Java.

Вопросы. Часть 2

21. Зачем нужен оператор instanceof?
22. Зачем нужны и какие бывают блоки инициализации?
23. Каков порядок вызова конструкторов и блоков инициализации двух классов: потомка и его предка?
24. Где и для чего используется модификатор abstract?
25. Можно ли объявить метод абстрактным и статическим одновременно?
26. Что означает ключевое слово static?
27. К каким конструкциям Java применим модификатор static?
28. Что будет, если в static блоке кода возникнет исключительная ситуация?
29. Можно ли перегрузить static метод?
30. Что такое статический класс, какие особенности его использования?
31. Какие особенности инициализации final static переменных?
32. Как влияет модификатор static на класс/метод/поле?
33. О чем говорит ключевое слово final?
34. Дайте определение понятию “интерфейс”.
35. Какие модификаторы по умолчанию имеют поля и методы интерфейсов?
36. Почему нельзя объявить метод интерфейса с модификатором final или static?
37. Какие типы классов бывают в java (вложенные… и.т.д.)
38. Какие особенности создания вложенных классов: простых и статических.
39. Что вы знаете о вложенных классах, зачем они используются? Классификация, варианты использования, о нарушении инкапсуляции.
40. В чем разница вложенных и внутренних классов?
41. Какие классы называются анонимными?
42. Каким образом из вложенного класса получить доступ к полю внешнего класса?

Ответы. Часть 2

21. Зачем нужен оператор instanceof?

Оператор instanceof возвращает true, если объект является экземпляром класса или его потомком.

Источник

Может ли абстрактный класс иметь конструктор?

Может ли абстрактный класс иметь конструктор?

Если да, то как это можно использовать и для каких целей?

Да, абстрактный класс может иметь конструктор. Учти это:

Суперкласс Product является абстрактным и имеет конструктор. Конкретный класс TimesTwo имеет конструктор, который просто жестко кодирует значение 2. Конкретный класс TimesWhat имеет конструктор, который позволяет вызывающей стороне указывать значение.

Абстрактные конструкторы будут часто использоваться для обеспечения ограничений класса или инвариантов, таких как минимальные поля, необходимые для настройки класса.

ПРИМЕЧАНИЕ. Поскольку в родительском объекте нет конструктора по умолчанию (или без аргументов) абстрактный класс, конструктор, используемый в подклассе, должен явно вызывать родительский конструктор.

Вы бы определили конструктор в абстрактном классе, если находитесь в одной из следующих ситуаций:

Обратите внимание, что:

В любом случае, не забывайте, что если вы не определили конструктор, то компилятор автоматически сгенерирует его для вас (этот является общедоступным, не имеет аргументов и ничего не делает).

Да, он может иметь конструктор, и он определен и ведет себя так же, как конструктор любого другого класса. За исключением того, что абстрактные классы не могут быть непосредственно созданы, только расширены, поэтому использование всегда происходит из конструктора подкласса.

Да, когда мы определяем класс как абстрактный класс, он не может быть создан, но это не означает, что абстрактный класс не может иметь конструктор. Каждый абстрактный класс должен иметь конкретный подкласс, который будет реализовывать абстрактные методы этого абстрактного класса.

Когда мы создаем объект любого подкласса, все конструкторы в соответствующем дереве наследования вызываются в подходе сверху вниз. То же самое относится и к абстрактным классам. Хотя мы не можем создать объект абстрактного класса, когда мы создаем конкретный объект класса и подкласс абстрактного класса, конструктор абстрактного класса вызывается автоматически. Следовательно, мы можем иметь конструктор в абстрактных классах.

Примечание: у неабстрактного класса не может быть абстрактных методов, но у абстрактного класса может быть неабстрактный метод. Причина аналогична конструкторам, с той разницей, что вместо автоматического вызова мы можем вызвать super (). Кроме того, нет ничего лучше абстрактного конструктора, поскольку он не имеет никакого смысла.

Мало того, что это может, это всегда так. Если вы не укажете один из них, то у него будет конструктор по умолчанию без аргументов, как и у любого другого класса. Фактически, ВСЕ классы, включая вложенные и анонимные классы, получат конструктор по умолчанию, если он не указан (в случае анонимных классов его невозможно указать, поэтому вы всегда получите конструктор по умолчанию).

Хорошим примером абстрактного класса, имеющего конструктор, является Calendar class. Вы получаете объект Calendar, вызывая Calendar.getInstance (), но он также имеет конструкторы, которые защищены. Причина, по которой его конструкторы защищены, заключается в том, что их могут вызывать только его подклассы (или классы в одном и том же пакете, но поскольку он абстрактный, это не применимо). GregorianCalendar является примером класса, расширяющего Календарь.

У абстрактного класса может быть конструктор, НО вы не можете создать объект абстрактного класса, так как вы используете этот конструктор?

Дело в том, что когда вы наследуете этот абстрактный класс в своем подклассе, вы можете передавать значения в его (абстрактный) конструктор через метод super (значение) в своем подклассе, и нет, вы не наследуете конструктор.

поэтому с помощью super вы можете передавать значения в конструктор абстрактного класса, и, насколько я помню, это должен быть первый оператор в вашем методе или конструкторе.

Да, может, конструкторы абстрактных классов обычно используются для супер-вызовов для событий инициализации, общих для всех подклассов.

Источник

Может ли абстрактный класс иметь конструктор?

абстрактный класс может иметь конструктор?

Если да, то как его можно использовать и для каких целей?

21 ответов:

да, абстрактный класс может иметь конструктор. Рассмотрим это:

суперкласс Product является абстрактным и имеет конструктор. Конкретный класс TimesTwo имеет конструктор, который просто жестко кодирует значение 2. Конкретный класс TimesWhat имеет конструктор, который позволяет звонящему указать значение.

абстрактные конструкторы часто используются для применения ограничений класса или инвариантов, таких как минимальные поля, необходимые для установки класс.

Примечание: поскольку нет конструктора по умолчанию (или no-arg) в родительском элементе абстрактный класс, конструктор, используемый в подклассе должен явно вызывать родительский конструктор.

вы определите конструктор в абстрактном классе, если вы находитесь в одной из следующих ситуаций:

в любом случае, не забывайте, что если вы не определите конструктор, затем компилятор автоматически сгенерирует его для вас (этот является общедоступным, не имеет аргумента и ничего не делает).

Да, он может иметь конструктор, и он определен и ведет себя так же, как конструктор любого другого класса. За исключением того, что абстрактные классы не могут быть непосредственно созданы, только расширены, поэтому использование всегда происходит из конструктора подкласса.

да! абстрактные классы могут иметь конструкторы!

Да, когда мы определяем класс как абстрактный класс, он не может быть создан, но это не означает, что абстрактный класс не может иметь конструктор. Каждый абстрактный класс должен иметь конкретный подкласс, который будет реализовывать абстрактные методы, что абстрактный класс.

при создании объекта любого подкласса все конструкторы в соответствующем дереве наследования вызываются в подход сверху вниз. То же самое относится и к абстрактным классам. Хотя мы не можем создать объект абстрактного класса, когда мы создаем объект класса, который является конкретным и подкласс абстрактного класса, конструктор абстрактного класса вызывается автоматически. Следовательно, мы можем иметь конструктор в абстрактных классах.

Примечание: не-абстрактный класс может иметь абстрактные методы, но абстрактный класс может иметь неабстрактный метод. Причина подобна тому из конструкторы, разница в том, что вместо автоматического вызова мы можем вызвать super (). Кроме того, нет ничего похожего на абстрактный конструктор, поскольку это вообще не имеет смысла.

не только может, он всегда так делает. Если вы не укажете один, то он имеет конструктор arg по умолчанию, как и любой другой класс. Фактически, все классы, включая вложенные и анонимные классы, получат конструктор по умолчанию, если он не указан (в случае анонимных классов невозможно указать один, поэтому вы всегда получите конструктор по умолчанию).

хорошим примером абстрактного класса с конструктором является календарь класса. Вы получаете Объект календаря путем вызова календаря.getInstance (), но он также имеет конструкторы, которые защищены. Причина, по которой его конструкторы защищены, заключается в том, что только его подклассы могут вызывать их (или классы в одном пакете, но поскольку он абстрактен, это не применяется). GregorianCalendar является примером класса, который расширяет календарь.

Да, это может быть, абстрактные конструкторы классов обычно используются для супер-вызовов событий инициализации, общих для всех подклассов

абстрактный класс может иметь конструктор, но вы не можете создать объект абстрактного класса, так как вы можете использовать этот конструктор?

дело в том, что когда вы наследуете этот абстрактный класс в своем подклассе, вы можете передавать значения его(абстрактного) конструктора через метод super(value) в своем подклассе, и нет, вы не наследуете конструктор.

таким образом, используя super вы можете передавать значения в конструкторе абстрактного класса и, насколько я помню, он должен быть первым оператор в вашем методе или конструкторе.

хотя есть много хороших ответов, я хотел бы дать мои 2 цента.

конструктор НЕ СТРОИТ ОБЪЕКТ. Он используется для инициализации объекта.

абстрактный класс (В отличие от интерфейса) могут иметь неокончательные нестатические поля, которые нуждаются в инициализации. Вы можете написать свой собственный конструктор в абстрактном классе, чтобы сделать это. Но, в этом случае, не будет никакого конструктора по умолчанию.

будьте осторожны при расширении выше абстрактного класса, вы должны явно вызвать super из каждого конструктора. Первая строка любого конструктора вызывает super (). если вы явно не вызываете super (), Java сделает это за вас. Ниже код не будет компилироваться:

у вас есть чтобы использовать его, как показано ниже пример:

суперкласс является абстрактным и имеет конструктор.

конечно, абстрактный класс может иметь конструктор.Обычно конструктор класса используется для инициализации fields.So, абстрактный конструктор класса используется для инициализации полей абстрактного класса. Вы можете предоставить конструктор для абстрактного класса, если хотите инициализировать определенные поля абстрактного класса до создания экземпляра дочернего класса. Абстрактный конструктор класса также может быть использован для выполнения кода, относящегося к каждому дочернему классу. Это предотвращает код дублирование.

мы не можем создать экземпляр абстрактного класса, но мы можем создать экземпляры классов, которые являются производными от абстрактного класса. Таким образом, при создании экземпляра производного класса автоматически вызывается родительский конструктор абстрактного класса.

в конкретном классе объявление конструктора для конкретного типа Fnord эффективно предоставляет две вещи:

средство, с помощью которого код может запросить создание экземпляра Fnord

средство, с помощью которого экземпляр типа, производного от Fnord который находится в стадии разработки может запросить, чтобы все функции базового класса были инициализированы.

хотя, возможно, должны быть средства, с помощью которых эти две способности могут быть контролируемый отдельно, для каждого конкретного типа одно определение позволит. Хотя первая способность не имеет значения для абстрактного класса, вторая способность имеет такое же значение для абстрактного класса, как и для любого другого, и поэтому ее объявление так же необходимо и полезно.

Источник

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *