Définition d'une classe abstraite sans aucune méthode abstraite

Puis-je définir une classe abstraite sans ajouter de méthode abstraite?

78

11 réponses

Bien sûr.

Déclarer un résumé de classe signifie seulement que vous ne lui permettez pas d'être instancié seul.

Déclarer un résumé de méthode signifie que les sous-classes doivent fournir une implémentation pour cette méthode.

Les deux sont des concepts distincts, bien que vous ne puissiez évidemment pas avoir de méthode abstraite dans une classe non abstraite. Vous pouvez même avoir des classes abstraites avec des méthodes final mais jamais l'inverse.

129
répondu biziclop 2017-05-19 17:03:37

Oui, vous pouvez le faire. Pourquoi ne pas vous essayez de faire ça?

13
répondu Marc W 2011-01-27 00:13:32

Oui, vous pouvez. La classe abstraite java signifie que vous ne pouvez pas créer un objet de la classe. Et une méthode abstraite les sous-classes doivent fournir une implémentation pour cette méthode.

Vous pouvez donc facilement définir une classe abstraite sans aucune méthode abstraite.

Comme par Exemple :

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);
    }
}

C'est très bien.

8
répondu Shreyos Adikari 2012-11-30 01:56:06

Oui, vous pouvez créer une classe abstraite sans aucune méthode abstraite le meilleur exemple de classe abstraite sans méthode abstraite est HttpServlet
La méthode abstraite est une méthode qui n'a pas de corps, si vous avez déclaré au moins une méthode dans la classe, la classe doit être déclarée comme un résumé obligatoire mais si vous avez déclaré la classe abstraite ce n'est pas obligatoire de déclarer la méthode abstraite dans la classe.

Vous ne pouvez pas créer d'objets de classe abstraite, ce qui signifie qu'il ne peut pas être instancier.

5
répondu JegsVala 2016-07-01 17:14:00

Oui, vous pouvez déclarer une classe que vous ne pouvez pas instancier seule avec uniquement des méthodes qui ont déjà des implémentations. Cela serait utile si vous vouliez ajouter des méthodes abstraites à l'avenir, ou si vous ne vouliez pas que la classe soit directement instanciée même si elle n'a pas de propriétés abstraites.

4
répondu Gordon Gustafson 2011-01-27 00:26:22

Oui, nous pouvons avoir une classe abstraite sans méthodes abstraites car les deux sont des concepts indépendants. Déclarer un résumé de classe signifie qu'il ne peut pas être instancié seul et ne peut être que sous-classé. Déclarer un résumé de méthode signifie que cette méthode sera définie dans la sous-classe.

3
répondu Vivek Vermani 2014-01-14 04:24:36

Oui vous pouvez le faire.

Déclarer la classe abstraite signifie que la classe ne sera instanciée par aucune autre classe.

Et il devrait y avoir au moins une méthode abstraite à l'intérieur de cela et le sens de cela, vous pouvez déclarer la méthode abstraite dans cette classe si vous ne déclarez pas la méthode que son ok.

Exemple:

public abstract class abs {

    protected int cx = 0, cy = 0;

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

Cela fonctionnera à coup sûr.

2
répondu Kishan 2014-12-08 06:22:42

Oui, vous pouvez définir une classe abstraite sans méthode abstraite. Cependant, s'il n'y a pas de méthode à l'intérieur, vous feriez mieux d'aller avec une interface

2
répondu fmucar 2016-12-05 10:07:15

Oui, nous pouvons déclarer une classe abstraite, sans aucune méthode abstraite. le but de déclarer une classe comme abstraite n'est pas d'instancier la classe.

Donc deux cas

1) classe abstraite avec des méthodes abstraites.

Ce type de classes, nous devons hériter d'une classe de cette classe abstraite et doit remplacer les méthodes abstraites dans notre classe, ex: Classe GenricServlet

2) classe abstraite sans méthodes abstraites.

Ce type de classes, nous devons hériter d'un classe de cette classe abstraite, ex: Classe HttpServlet le but de faire est bien que vous si vous n'implémentez pas votre logique dans la classe enfant, vous pouvez obtenir la logique parent

Veuillez vérifier le code source HttpServlet

2
répondu Manoj Kalluri 2017-04-20 17:32:15

Oui, vous pouvez. Parfois, vous pouvez vous poser cette question que quel est le but de faire cela? La réponse est: parfois, nous devons empêcher la classe d'instancier par elle-même. Dans ce cas, nous voulons que l'utilisateur étende notre classe abstraite et instancie la classe enfant

1
répondu Nandkishor Gokhe 2016-12-04 06:26:59

Vous pouvez, la question dans mon esprit est plus si vous. Dès le début, je dirai qu'il n'y a pas de réponse dure et rapide. Faire la bonne chose pour votre situation actuelle.

Pour moi, l'héritage implique une relation 'est-a'. Imaginez une classe de chien, qui peut être étendue par des sous-types plus spécialisés (Alsacien, caniche, etc). Dans ce cas, faire le résumé de la classe de chien peut être la bonne chose à faire puisque les sous-types sont des chiens. Maintenant, imaginons que les chiens ont besoin d'un collier. Dans ce cas l'héritage n'a pas de sens: il est absurde d'avoir une relation "est-a" entre les chiens et les colliers. C'est certainement une relation "a-a", collar est un objet collaboratif. Faire un collier abstrait juste pour que les chiens puissent en avoir un n'a pas de sens.

Je trouve souvent que les classes abstraites sans méthodes abstraites expriment vraiment une relation 'a-a'. Dans ces cas, je trouve généralement que le code peut être mieux pris en compte sans utiliser l'héritage. Je trouve aussi que les classes abstraites sans méthode abstraite sont souvent une odeur de code et à tout le moins devrait conduire à des questions soulevées dans un examen de code.

Encore une fois, c'est entièrement subjectif. Il peut bien y avoir des situations où une classe abstraite sans méthodes abstraites a du sens, c'est entièrement à l'interprétation et à la justification. Prenez la meilleure décision pour tout ce que vous travaillez sur.

1
répondu Jeremy 2018-03-22 13:33:27