Qu'est-ce qu'une classe abstraite et une méthode abstraite en Java ? Quand dois-je l'utiliser ? Tutoriel joint
Publié: 2019-09-12
Il y a quelques jours, j'ai écrit un article sur les principes fondamentaux de Java sur Qu'est-ce qu'une interface en Java et comment elle est utilisée? Ce tutoriel est également lié aux principes fondamentaux de Java " Abstract Class and Abstract Method
".
Qu'est-ce qu'une classe abstraite?
Commençons d'abord par comprendre la classe abstraite, puis nous passerons en revue l'exemple.
- Une classe abstraite est une classe déclarée
abstract
- Les classes abstraites ne peuvent pas être instanciées
- Les classes abstraites peuvent être sous-classées
- Il peut inclure ou non des méthodes abstraites
- Lorsqu'une classe abstraite est
subclassed
-classée, la sous-classe fournit généralement des implémentations pour toutes les méthodes abstraites de sa classe parent. - Si la sous-classe ne fournit pas d'implémentations, la sous-classe doit également être déclarée
abstract
.
Il s'agit d'une basic Java Interview Question
. Probablement la 1 st Java Interview Question
que vous recevez lors de l'entretien.
Puis-je définir une classe abstraite sans ajouter de méthode abstraite ?
Bien sûr que oui. Déclarer un abstract de classe signifie seulement que vous ne lui permettez pas d'être instancié par lui-même. Vous ne pouvez pas avoir de méthode abstraite dans une classe non abstraite.
Qu'est-ce qu'une méthode abstraite ?
- Une
abstract method
est une méthode déclarée sans implémentation. - Il a juste une signature de méthode.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 |
package crunchify . com . tutorial ; /** * @author Crunchify.com * Simple Abstract Class and Method Example with live result * */ public abstract class CrunchifyExam { public enum ExamStatus { PASSED , FAILED } private String examTime ; private ExamStatus status ; public CrunchifyExam ( String examTime , ExamStatus status ) { this . examTime = examTime ; this . status = status ; } public String getExamTime ( ) { return examTime ; } public void setExamTime ( String examTime ) { this . examTime = examTime ; } public void setExamStatus ( ExamStatus status ) { this . status = status ; } public ExamStatus getExamStatus ( ) { return status ; } abstract public void checkResult ( ) ; } |
Commençons par un exemple. Description du problème:
- Créez la classe
CrunchifyExam.java
, qui a une méthode abstraite appeléecheckResult()
- Créez la classe
Crunchify1stSchoolExamResult.java
, qui étend la classe abstraiteCrunchifyExam.java
- Créer la classe
Crunchify2ndSchoolExamResult.java
, qui étend la classe abstraiteCrunchifyExam.java
- Maintenant, les deux classes ci-dessus doivent fournir une implémentation pour la méthode checkResult()
- Les deux écoles peuvent avoir leur propre
procedure
ounumber of checks
pour savoir si l'utilisateur estPASSED or FAILED
, elles sont libres d'avoir leur propre implémentation decheckResult()
Une fois que vous avez étendu la classe CrunchifyExam
dans Crunchify1stSchoolExamResult.java
- Eclipse vous invitera à implémenter les méthodes abstraites mentionnées dans CrunchifyExam.java

Crunchify1st SchoolExamResult.java
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 |
package crunchify . com . tutorial ; /** * @author Crunchify.com */ public class Crunchify1stSchoolExamResult extends CrunchifyExam { public Crunchify1stSchoolExamResult ( String examTime , ExamStatus status ) { super ( examTime , status ) ; // TODO Auto-generated constructor stub } @Override public void checkResult ( ) { String studentName = "Crunchify1" ; String studentResult = "85%" ; // School NO-1 will provide all their formula to find if user is passed or failed. // After detailed calculation let's say student's grade is "PASSED". System . out . println ( "Hey.. this is user " + studentName + " with grade " + studentResult + " - " + getExamStatus ( ) + ", ExamTime: " + getExamTime ( ) ) ; } } |
Crunchify2 nd SchoolExamResult.java
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 |
package crunchify . com . tutorial ; import java . text . DateFormat ; import java . text . SimpleDateFormat ; import java . util . Date ; /** * @author Crunchify.com */ public class Crunchify2ndSchoolExamResult extends CrunchifyExam { public Crunchify2ndSchoolExamResult ( String examTime , ExamStatus status ) { super ( examTime , status ) ; } @Override public void checkResult ( ) { String studentName = "Crunchify2" ; String studentResult = "45%" ; // School NO-2 will provide all their formula to find if user is passed or failed. // After detailed calculation let's say student's grade is "FAILED". log ( "Hey.. this is user " + studentName + " with grade " + studentResult + " - " + getExamStatus ( ) + ", ExamTime: " + getExamTime ( ) ) ; } public static void main ( String args [ ] ) { DateFormat dateFormat = new SimpleDateFormat ( "yyyy/MM/dd HH:mm:ss" ) ; // 1st School's checkResult() Date date = new Date ( ) ; String examTime = dateFormat . format ( date ) ; log ( "Initializing 1st School object at time " + examTime ) ; // We are setting up time and Result for 1st School Crunchify1stSchoolExamResult object = new Crunchify1stSchoolExamResult ( examTime , ExamStatus . PASSED ) ; object . checkResult ( ) ; // Let's wait 5 seconds wait to see time difference in console log try { Thread . sleep ( 5000 ) ; } catch ( InterruptedException e ) { e . printStackTrace ( ) ; } // 2nd School's checkResult() date = new Date ( ) ; examTime = dateFormat . format ( date ) ; log ( "\nInitializing 2nd School object at time " + examTime ) ; // We are setting up time and Result for 2nd School Crunchify2ndSchoolExamResult object2 = new Crunchify2ndSchoolExamResult ( examTime , ExamStatus . FAILED ) ; object2 . checkResult ( ) ; } // Simple log method private static void log ( String value ) { System . out . println ( value ) ; } } |
Résultat de la console Eclipse :
Faites un clic droit sur Crunchify2ndSchoolExamResult.java
et exécutez-le en tant qu'application Java Application
pour voir le résultat ci-dessous.

1 2 3 4 5 |
Initializing 1st School object at time 2016 / 11 / 30 14 : 24 : 37 Hey . . this is user Crunchify1 with grade 85 % - PASSED ExamTime : 2016 / 11 / 30 14 : 24 : 37 Initializing 2nd School object at time 2016 / 11 / 30 14 : 24 : 42 Hey . . this is user Crunchify2 with grade 45 % - FAILED ExamTime : 2016 / 11 / 30 14 : 24 : 42 |
Maintenant, vous pouvez avoir une question
Pourquoi ne puis-je pas utiliser Interface ici plutôt que d'avoir Abstract Method
and Class
et avoir CrunchifyExam comme interface?
Eh bien, bien Sure you could
, mais vous devez également implémenter les getExamTime
(), setExamTime
(), getExamTime
(), setExamTime
().
En utilisant des classes abstraites, vous pouvez hériter de l'implémentation d'autres méthodes (non abstraites). Vous ne pouvez pas faire cela avec des interfaces - une interface cannot provide
aucune implémentation de méthode.
Est-il possible de créer une classe abstraite et finale en Java ?
- L'abstrait et le final sont des concepts mutuellement exclusifs.
- Donc la réponse est NON, nous ne pouvons pas rendre une classe abstraite ou une méthode finale en Java.
- La classe finale est une classe complète et ne peut pas être prolongée davantage.
- La classe abstraite est appelée classe incomplète et ne peut être étendue que par une autre classe concrète et vous devez implémenter toutes les méthodes abstraites.
- De plus, il n'y a aucun moyen et il n'est pas possible d'avoir une méthode abstraite dans une classe finale.
Est-il possible d'hériter de plusieurs classes abstraites en Java ?
- Java ne prend pas en charge l'héritage multiple.
- En Java, nous ne pouvons étendre qu'une seule classe.
- En Java, nous pouvons implémenter des interfaces à partir de nombreuses sources.