web-dev-qa-db-fra.com

Définir une classe abstraite sans aucune méthode abstraite

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

101
VisaMasterCard

Bien sûr.

Déclarer un résumé de classe signifie uniquement que vous ne lui permettez pas d’être instancié lui-même.

La déclaration d'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 une méthode abstraite dans une classe non abstraite. Vous pouvez même avoir des classes abstraites avec les méthodes final mais jamais l'inverse.

148
biziclop

Oui, vous pouvez le faire. Pourquoi n'essaies-tu pas de faire ça?

15
Marc W

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

Ainsi, vous pouvez facilement définir une classe abstraite sans aucune méthode abstraite.

comme pour l'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 bon.

8
Shreyos Adikari

YES 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 sous la forme d’un résumé, son obligatoire, MAIS si vous avez déclaré la classe abstraite, il n’est pas obligatoire de le déclarer. méthode à l'intérieur de la classe.

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

5
JegsVala

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

4
Gordon Gustafson

oui, nous pouvons déclarer une classe abstraite sans aucune méthode abstraite. Déclarer une classe abstraite n'a pas pour but d'instancier la classe.

donc deux cas

1) classe abstraite avec des méthodes abstraites.

pour ce type de classes, nous devons hériter d'une classe de cette classe abstraite et remplacer les méthodes abstraites de notre classe, ex: classe GenricServlet.

2) classe abstraite sans méthodes abstraites.

ce type de classes, nous devons hériter d'une classe de cette classe abstraite, ex: la classe HttpServlet a pour but de faire bien que si vous n'implémentez pas votre logique dans la classe enfant, vous pouvez obtenir la logique parente

veuillez vérifier le code source HttpServlet

3
Manoj Kalluri

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é par lui-même et ne peut être que sous-classé. Déclarer un résumé de méthode signifie que Method sera défini dans la sous-classe.

3
Vivek Vermani

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, mieux vaut utiliser une interface

2
fmucar

oui, tu peux faire ça.

déclarer une classe abstraite signifie que cette 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 la signification de cela, vous pouvez déclarer une 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
Kishan

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

Pour moi, l'héritage implique une relation "est-a". Imaginez une classe de chiens, qui peut être étendue à des sous-types plus spécialisés (alsacien, caniche, etc.). Dans ce cas, il peut être judicieux de faire l’abrégé sur la classe de chiens, car 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 chiens et colliers. Il s’agit bien d’une relation "has-a", le collier est un objet collaborateur. Rendre le collier abstrait 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 réellement une relation "a-a". Dans ces cas, je trouve généralement que le code peut être mieux factorisé sans utiliser l'héritage. Je trouve également que les classes abstraites sans méthode abstraite dégagent souvent une odeur de code et devraient à tout le moins poser des problèmes lors d'une révision de code.

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

1
Jeremy

Oui, vous pouvez. Parfois, on peut vous poser la question suivante: à quoi sert-il? La réponse est: nous devons parfois empêcher la classe d’instancier par elle-même. Dans ce cas, nous souhaitons que l’utilisateur étende notre classe Abstract et instancie une classe enfant.

1
Nandkishor Gokhe