Определение абстрактного класса без абстрактных методов

114

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

Visa, Euro
источник
1
Хороший пример можно найти в шаблоне декоратора, см. Здесь . Оба WindowDecoratorи CoffeeDecoratorявляются abstractклассами, но ни один из них не включает abstractметод.
MS Dousti

Ответы:

168

Конечно.

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

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

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

biziclop
источник
14

Да, ты можешь сделать это. Почему бы тебе просто не попробовать это сделать?

Марк В
источник
6
И это не только ОП. Посмотрите на все положительные голоса, полученные за вопрос!
Marc W
54
@ karim79 Нет нужды в высоких лошадях и прочей чепухе. Попытка не совсем раскрывает, почему это разрешено, хотя спросить может.
biziclop
7
@bizclop - Попробовать на себе, возможно, дало бы более продуктивный вопрос. Нет высоких лошадей. Это довольно просто. Его вопрос был «Могу ли я», а не «Почему это ...».
karim79
8
Если на вопрос можно ответить просто «да» или «нет», задающий вопрос должен подумать о том, чтобы перефразировать, использовать Google или просто попробовать.
Тайлер Трит
3
@ karim79 Да, вопрос можно было бы сформулировать лучше, но я думаю, что не нужно много усилий, чтобы заглянуть на шаг впереди.
biziclop
8

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

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

Как например:

public abstract class AbstractClass{

    public String nonAbstractMethodOne(String param1,String param2){
        String param = param1 + param2;
        return param;
    }

    public static void nonAbstractMethodTwo(String param){
        System.out.println("Value of param is "+param);
    }
}

Это отлично.

Шрейос Адикари
источник
6

ДА. Вы можете создать абстрактный класс без какого-либо абстрактного метода. Лучшим примером абстрактного класса без абстрактного метода является HttpServlet.
Абстрактный метод - это метод, не имеющий тела. Если вы объявили хотя бы один метод в классе, класс должен быть объявлен как абстрактное его обязательное НО, если вы объявили абстрактный класс, необязательно объявлять абстрактный метод внутри класса.

Вы не можете создавать объекты абстрактного класса, что означает, что он не может быть создан.

JegsVala
источник
4

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

Гордон Густафсон
источник
Вопрос был не в пустых абстрактных классах, а только в абстрактных классах без абстрактных методов. Насколько я понимаю, нет веской причины для использования полностью пустого абстрактного класса.
biziclop
1
Ответ исправлен. Использование пустого абстрактного класса могло бы быть полезным, если бы у вас была веская причина добавить абстрактные методы позже и вам не приходилось заниматься рефакторингом каких-либо других родительских классов.
Гордон Густафсон
1
В середине иерархии полностью пустой (за исключением спецификации наследования) абстрактный класс может иметь смысл, если производные этого класса будут иметь другие договорные обязательства, чем другие производные родительского класса.
supercat
3

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

так что два случая

1) абстрактный класс с абстрактными методами.

этого типа классов, мы должны унаследовать класс от этого абстрактного класса и должны переопределить абстрактные методы в нашем классе, например: GenricServlet class

2) абстрактный класс без абстрактных методов.

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

пожалуйста, проверьте исходный код HttpServlet

Манодж Каллури
источник
2

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

Вивек Вермани
источник
Почему мне не нужно, чтобы этот класс не создавался? Есть ли веская причина, пример?
karlihnos
1

да, ты можешь это сделать.

объявление абстрактного класса означает, что класс не будет создан каким-либо другим классом.

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

пример:

public abstract class abs {

    protected int cx = 0, cy = 0;

    public void p() {
        System.out.print("hello");
    }
}

это наверняка сработает.

Кишан Дхамат
источник
1

Да, ты можешь. Иногда вам могут задать вопрос: для чего это нужно? Ответ: иногда нам приходится ограничивать создание экземпляров класса самим по себе. В этом случае мы хотим, чтобы пользователь расширил наш абстрактный класс и создал экземпляр дочернего класса.

Нандкишор Гохе
источник
1

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

fmucar
источник
4
Хорошая идея взять минимум 30 символов.
Marc W
1
Если нет абстрактного метода, то как можно использовать интерфейс? По умолчанию интерфейс имеет все абстрактные методы.
Усман Рана
1

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

Для меня наследование подразумевает отношения «есть». Представьте себе класс собак, который можно расширить за счет более специализированных подтипов (эльзасский, пудель и т. Д.). В этом случае создание абстрактного класса собак может быть правильным решением, поскольку подтипы - это собаки. А теперь представим, что собакам нужен ошейник. В этом случае наследование не имеет смысла: бессмысленно иметь отношения «есть-а» между собаками и ошейниками. Это определенно отношения «есть», ошейник - объект сотрудничества. Делать ошейник абстрактным только для того, чтобы его могли носить собаки, не имеет смысла.

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

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

Джереми
источник
1

На самом деле нет никакого смысла, если у абстрактного класса нет абстрактного метода. Абстрактный класс подобен отцу. У этого отца есть некоторые свойства и поведения, когда вы в детстве хотите быть ребенком отца, отец говорит ребенку (вам), что должен быть таким, это наш МОТО, и если вы не хотите этого делать, вы не мой ребенок.

Мохаммад Давари
источник