web-dev-qa-db-fra.com

Pourquoi ne pouvons-nous pas instancier une classe abstraite en JAVA?

Je comprends:

  1. Puisque la classe abstraite n’est rien en soi, c’est-à-dire un véhicule, c’est pourquoi nous voulons créer un objet avec une implémentation concrète comme Voiture, Vélo, etc.
  2. Le constructeur d'une classe abstraite est appelé lors du chaînage d'objets.

  3. On ne peut jamais créer directement d'objet de classe Abstract même s'il contient un constructeur et que toutes les méthodes sont implémentées 

pourquoi ? Je cherche à comprendre du point de vue du compilateur, pourquoi Java les oblige?

Merci 

10
sandejai

Ce n’est pas une limitation technique, mais (comme vous l’avez souligné) une logique. Java (et de nombreux autres langages) appliquent diverses règles non pas parce qu’elles sont impossibles à enfreindre, mais parce que cela fait intentionnellement partie du langage.

10
Eli Iser

Un cours abstrait n'est pas complet! L'auteur a marqué cela comme étant abstrait pour vous indiquer que certains l'implémentation manque dans le code. L'auteur a effectué une partie du travail, mais vous devez lui-même saisir quelques éléments pour le faire fonctionner. Le mot clé abstract garantit que personne ne lancerait accidentellement cette classe incomplète.

Pensez à réparer une voiture. Quelqu'un a retiré les plaquettes de frein et les remplacera le lendemain. Maintenant, pour éviter que quelqu'un conduise accidentellement cette voiture (qui n'a pas de freins installés), le mécanicien installe un verrou sur le volant. C'est une mesure infaillible.

17
kevin

rocketboy montre des raisons mécanistes, mais il y a une raison conceptuelle.

Une classe abstraite représente un concept abstrait. Prenons l'exemple de votre véhicule. Vous ne pouvez pas construire un véhicule qui n’est pas quelque chose de plus spécifique. Vous pouvez avoir un ensemble de véhicules, qui pourraient être constitués d'escaliers à gué de 2004, de corolles et de 98 et de 1984, un cs36 (une sorte de yacht), un transport en vrac de milieu de gamme de la marque 4 Firefly Prenez chacun de ceux-ci individuellement et appelez-les un véhicule, mais vous ne pouvez pas avoir quelque chose qui ne soit qu'un véhicule et non un de ceux-ci ou un autre type spécifique de véhicule.

Les classes abstraites représentent des concepts abstraits comme véhicule. Par conséquent, l'idée d'instancier un n'est pas sensuelle, car pour l'instancier, vous devez savoir ce que vous instanciez.

5
Taylor
  1. Si une classe est marquée avec le mot-clé abstract, elle est appelée classe abstraite. Il ne peut PAS être instancié en utilisant un nouvel opérateur. Mais une classe abstraite peut être utilisée comme référence de superclasse pour l’objet sous-classe

  2. Une classe qui n'est PAS une classe abstraite s'appelle une classe concrète

  3. Il y a tellement de classes abstraites dans l'API Java et la plupart d'entre elles sont incluses dans la bibliothèque d'interface graphique utilisateur et la structure de collections.

  4. Une classe abstraite doit être étendue et une méthode abstraite doit être remplacée

  5. Si une méthode est déclarée avec le mot-clé abstract, elle ne devrait PAS avoir de corps. Seulement, il peut avoir un nom, des paramètres et un type de retour, mais PAS le corps

  6. Si vous avez une méthode abstraite, la classe doit également être déclarée comme étant abtracr. Ainsi, une classe concrète ne peut PAS avoir de méthodes abstraites, seule une classe abstraite peut avoir des méthodes abstraites.

  7. Outre les méthodes abstraites, une classe abstraite peut également avoir des membres d'instance, un initialiseur d'instance, des constructeurs, des initialiseurs statiques et des membres statiques. Ici, les constructeurs et l'initialiseur d'instance de la classe abstraite seraient invoqués lorsque la sous-classe de la classe abstraite serait instanciée et l'initialiseur statique de la classe abstraite serait invoqué lorsque la classe abstraite serait chargée par la JVM.

  8. Si une classe concrète étend une classe abstraite, elle doit redéfinir toutes les méthodes abstraites de la superclasse abstraite, ce qui s'appelle l'implémentation d'une classe abstraite.

  9. Pour l'implémentation partielle d'une classe abstraite, nous pouvons prendre une sous-classe abstraite qui peut étendre la superclasse abstraite. Dans cette situation, la sous-classe remplace toutes les méthodes abstraites de la super-classe abstraite n'est PAS nécessaire. L'implémentation partielle d'une superclasse abstraite ou d'une interface ne peut être réalisée que par les classes abstraites. Une classe concrète ne peut PAS être utilisée pour l'implémentation partielle d'une classe abstraite car les classes concrètes ne peuvent PAS avoir de méthodes abstraites

  10. Les classes abstraites et les méthodes abstraites NE PEUVENT PAS être déclarées avec le mot clé final, c’est-à-dire qu’une classe peut être abstraite ou finale. De même, une méthode peut être abstraite ou définitive.

  11. Les méthodes abstraites ne peuvent PAS être déclarées avec le mot-clé private

  12. Les méthodes abstraites ne peuvent PAS être déclarées avec le mot clé synchronized. Même si vous avez besoin d’une méthode sécurisée pour les threads, lors de l’implémentation de la classe abstraite (lorsque la méthode abstraite sera remplacée par la sous-classe conrete), la méthode remplacée peut être marquée avec le mot clé synchronized

  13. Les méthodes abstraites ne peuvent PAS être marquées avec le mot clé static. Comme les méthodes statiques ne peuvent PAS être remplacées, elles peuvent être masquées par les méthodes statiques de la sous-classe.

  14. La méthode abstraite ne peut PAS être marquée avec le mot-clé native

  15. La méthode abstraite ne peut PAS être marquée avec le mot clé strictfp

  16. Donc vous seul pouvez utiliser le modificateur d’accès (autre que privé), type, paramètre avec une méthode abstraite

  17. Une classe commune ne peut PAS avoir de méthodes d'instance, mais une classe abstraite peut avoir des méthodes abstraites, des membres statiques, des membres d'instance, des initialiseurs statiques, des constructeurs et des initialiseurs d'instance.

  18. Si une classe abstraite implémente une interface ou étend une autre classe abstraite, il N'EST PAS nécessaire qu'elle substitue toutes les méthodes abstraites de l'interface. Mais ce n'est pas la même chose qu'avec les classes concrètes

  19. Il se peut également qu'une classe abstraite ne dispose d'aucune des méthodes abstraites.

  20. Les classes abstraites ne peuvent PAS être instanciées en utilisant un nouvel opérateur. Parce qu’un résumé peut avoir des méthodes abstraites, c’est-à-dire des méthodes sans corps (ni implémentation). Car un objet ne peut PAS avoir de méthodes abstraites et JVM ne peut PAS allouer de mémoire aux méthodes abstraites.

4
alexvipul

Parce qu'une classe abstraite est une structure squelette (une construction incomplète si vous le pouvez), d'où le terme abstrait.

abstract class Person(){
   abstract void Speak();
}

Signifie que chaque Person doit parler. Cela signifie que chaque personne devrait savoir parler (mettre en œuvre la speak()). new Person() ne peut pas avoir cela, donc ce n'est pas permis.

1
rocketboy

Vous ne pouvez pas instancier une interface ou une classe abstraite car cela défierait le modèle orienté objet. Lire la suite

1
Sunil S

Ce que je comprends des classes abstraites peuvent contenir des méthodes abstraites (vides sans implémentation). Si nous instancions un objet et appelons la méthode vide, cela ne fonctionnera pas et pourrait poser problème, le compilateur force donc cette règle .

1
sandejai

Une classe abstraite est une classe déclarée abstraite. Il peut inclure ou non des méthodes abstraites. 

Nous devons déclarer les méthodes Abstract class et Abstract avec la clé Word abstract.

Les classes abstraites ne peuvent pas être instanciées, ce qui signifie que nous ne pouvons pas créer d'objet pour la classe abstraite. Nous pouvons créer des sous-classes en classes abstraites.

Une classe abstraite peut avoir ou non des méthodes abstraites, méthode abstraite au sens où une méthode peut être déclarée sans aucune implémentation de corps est appelée méthode abstraite. Ainsi, dans ce cas, JVM ne sait pas combien de mémoire elle doit allouer à cette méthode abstraite, car celle-ci n’a pas d’implémentation body. Ainsi, JVM ne pourra pas allouer de la mémoire pour les méthodes abstraites lors de la création d'une instance dans la classe abstraite. JVM ne peut donc pas créer l'instance dans la classe abstraite. Nous ne pouvons donc pas créer l'objet pour la classe Abstract. 

Il est également possible que nous puissions créer une classe Abstract avec toutes les méthodes concrètes, c'est-à-dire sans aucune méthode abstraite. Dans ce cas également, nous ne pouvons pas créer l'instance pour la classe Abstract. Pourquoi parce que le mot clé abstract indique simplement à la machine virtuelle Java que la classe ne peut pas être instanciée. 

Les concepteurs de Java ont conçu la machine virtuelle Java que, lorsqu'elle trouve un mot clé abstrait pour une classe, la machine virtuelle Java ne peut pas créer l'instance de cette classe.

1
Sumedh Tambat

abstract it self self tell: existant dans la pensée ou sous forme d'idée mais n'ayant pas d'existence physique ou concrète . En Java, définition du mot clé abstrait, si abstract vient avant un nom de classe, JDK indique à la JVM de supprimer cet objet de classe initiation. C'est correct, la classe abstraite peut avoir plusieurs constructeurs mais uniquement pour le chaînage des constructeurs. 

1
Rudra

Vous POUVEZ instancier une classe abstraite. Il vous suffit de fournir une sous-classe concrète. 

0
Srinath Shah

Comme une classe abstraite est une classe incomplète (incomplète dans le sens où elle contient des méthodes abstraites sans corps ni sortie), nous ne pouvons pas créer d'instance ou d'objet; de la même manière que vous dites pour une interface.

0
Sonu patel

raison très simple, jvm jouant pour nous empêcher d'instancier une classe abstraite et une interface. 

Supposons que le compilateur nous permette d’instancier les deux ok. 

Ainsi, supposons que ma classe abstraite contienne 5 méthodes abstraites: seule méthode prototype, aucun corps de méthode. 

Donc, comme nous le savons, chaque appel de méthode crée une pile distincte dans la zone de pile Java jvm Cette allocation de mémoire est basée sur la structure de la méthode Et après exécution, cette pile est un droit de destruction.

Donc, si ma méthode ne contient aucun corps, comment jvm peut-il prédire la mémoire pour allouer cette méthode 

Deuxièmement, si no body signifie pas d’exécution de la méthode, elle ne détruira jamais de votre zone de pile Java, il se peut que vous obteniez une erreur de mémoire mémoire. 

Donc, pour considérer ces deux cas, le compilateur nous contraint à instancier à la fois les interfaces et les classes abstraites

0
naila naseem

Vous ne pouvez pas instancier une classe abstraite car il s'agit simplement de donner à votre classe une structure qui l'étend.

Et si vous voulez initier votre classe, pourquoi voulez-vous la définir comme abstrait ?

0
Ankita P.

Parce que Java l'a restreint, nous ne pouvons pas instancier la classe abstraite. Parce que dans le scénario général, résumé signifie "incomplet" afin que nous ne puissions pas créer un objet de choses incomplètes. Nous devons fournir l'implémentation complète d'une classe abstraite dans une classe concrète. Mais nous ne pouvons pas créer l'objet d'une classe abstraite.

0
Bharti Rawat