Использовать абстрактный класс без абстрактных методов

абстрактный класс не должен включать абстрактные методы.

есть ли другая причина сделать класс абстрактным, кроме того факта,что абстрактные классы не могут быть созданы?

7 ответов


основная роль абстрактного класса заключается в предоставлении соответствующего корневого класса, из которого могут быть получены конкретные (т. е. неабстрактные) подклассы. Это мощная и универсальная функция, которая способствует повторному использованию кода. Абстрактные классы инкапсулируют общие объекты, общие для ряда типов данных-объекты, которые слишком общие, чтобы быть значимыми в абстрактном классе, но которые могут быть переопределены в подклассе

любой класс с абстрактным методом автоматически сам абстрактный и должен определять себя как таковой с ключевым словом abstract-интересно, что абстрактный класс не должен содержать абстрактных методов

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

ссылки на объекты абстрактного класса могут быть объявлены, даже если объекты абстрактных классов не могут быть созданы, e.G учетная запись a; не будет генерировать синтаксическую ошибку

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

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


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


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

Как говорят другие, если он предназначен для базового класса - с потомками, объявляющими и реализующими интерфейсы / функциональность, которая слишком специфична для суперкласса-тогда abstract может быть подходящим в суперклассе.

в этом случае это объявление, что super не полезен сам по себе, и что подклассы будут делать что-то большее, о чем они объявят.


вы можете сделать класс как аннотация, даже если вы не хотите реализовать все методы интерфейса, которые класс осуществляет. Согласно java docs.

было отмечено, что класс, который реализует интерфейс, должен реализовать все методы интерфейса. Однако можно определить класс, который не реализует все методы интерфейса, при условии, что класс объявлен абстрактным.

никак вы не можете создать экземпляр класса, объявленного с аннотация.


не может быть абстрактной функции в абстрактном классе!

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

зачем мне нужна абстрактная функция?

в чем смысл использования абстрактных методов?

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

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

скажем, все, что вам нужно, это статическая функциональность класса. Статические переменные и функции. Так в основном вы не хотите, чтобы пользователи могли создавать экземпляры вашего класса. Теперь вы можете сделать ваш конструктор private тем самым исключает возможность создания его экземпляра, но вы этого не делаете я тоже этого хочу. Зачем писать дополнительные строки кода? В этом случае вы можете сделать класс абстрактным.


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

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

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


абстрактные классы служат шаблонами для своих подклассов. Например, абстрактное дерево классов и подкласс Banyan_Tree имеют все характеристики дерева, а также характеристики, характерные для дерева banyan.

понимание различий между абстрактным классом и интерфейсом имеет важное значение. Интерфейс имеет только объявления методов или абстрактные методы и постоянные члены данных, в то время как абстрактный класс может иметь абстрактные методы, переменные-члены и конкретные методы. Поскольку Java поддерживает только одно наследование, класс может реализовать несколько интерфейсов, но может расширить только один абстрактный класс.