Was ist eine abstrakte Klasse und abstrakte Methode in Java? Wann sollte ich es verwenden? Tutorial beigefügt
Veröffentlicht: 2019-09-12
Vor ein paar Tagen schrieb ich einen Artikel über grundlegende Java-Grundlagen zum Thema Was ist eine Schnittstelle in Java und wie wird sie verwendet? Dieses Tutorial bezieht sich auch auf grundlegende Java-Grundlagen „ Abstract Class and Abstract Method
“.
Was ist eine abstrakte Klasse?
Beginnen wir zuerst mit dem Verständnis der Abstract-Klasse und gehen dann das Beispiel durch.
- Eine abstrakte Klasse ist eine Klasse, die als
abstract
deklariert wird - Abstrakte Klassen können nicht instanziiert werden
- Abstrakte Klassen können in Unterklassen unterteilt werden
- Es kann abstrakte Methoden enthalten oder nicht
- Wenn eine abstrakte Klasse
subclassed
ist, stellt die Subklasse normalerweise Implementierungen für alle abstrakten Methoden in ihrer übergeordneten Klasse bereit - Wenn die Unterklasse keine Implementierungen bereitstellt, muss die Unterklasse auch als
abstract
deklariert werden.
Dies ist eine sehr basic Java Interview Question
. Wahrscheinlich die 1 st Java Interview Question
, die Sie während des Vorstellungsgesprächs erhalten.
Kann ich eine abstrakte Klasse definieren, ohne eine abstrakte Methode hinzuzufügen?
Natürlich ja. Das Deklarieren einer Klasse als abstrakt bedeutet nur, dass Sie nicht zulassen, dass sie selbst instanziiert wird. Sie können keine abstrakte Methode in einer nicht abstrakten Klasse haben.
Was ist eine abstrakte Methode?
- Eine
abstract method
ist eine Methode, die ohne Implementierung deklariert wird. - Es hat nur eine Methodensignatur.
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 ( ) ; } |
Beginnen wir mit einem Beispiel. Problembeschreibung:
- Erstellen Sie die Klasse
CrunchifyExam.java
mit einer abstrakten Methode namenscheckResult()
- Erstellen Sie die Klasse
Crunchify1stSchoolExamResult.java
, die die abstrakte KlasseCrunchifyExam.java
- Erstellen Sie die Klasse
Crunchify2ndSchoolExamResult.java
, die die abstrakte KlasseCrunchifyExam.java
- Jetzt müssen beide oben genannten Klassen eine Implementierung für die Methode checkResult() bereitstellen
- Beide Schulen können ihr eigenes
procedure
oder ihre eigenenumber of checks
haben, um herauszufinden, ob der BenutzerPASSED or FAILED
ist. Es steht ihnen frei, ihre eigene Implementierung voncheckResult()
zu haben.
Sobald Sie die CrunchifyExam
-Klasse in Crunchify1stSchoolExamResult.java
erweitern, fordert Eclipse Sie auf, die in CrunchifyExam.java
erwähnten abstrakten Methoden zu implementieren

CrunchifyErgebnis der 1. Schulprüfung.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 ( ) ) ; } } |
Crunchify2nd 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 ) ; } } |
Ergebnis der Eclipse-Konsole:
Klicken Sie einfach mit der rechten Maustaste auf Crunchify2ndSchoolExamResult.java
und führen Sie es als Java Application
aus, um das Ergebnis unten zu sehen.

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 |
Jetzt haben Sie vielleicht eine Frage
Warum kann ich hier nicht Interface verwenden, anstatt Abstract Method
und Class
und CrunchifyExam als Interface zu haben?
Nun – natürlich Sure you could
– aber Sie müssten auch die getExamTime
(), setExamTime
(), getExamTime
(), setExamTime
() implementieren.
Durch die Verwendung abstrakter Klassen können Sie die Implementierung anderer (nicht abstrakter) Methoden erben. Mit Interfaces ist das nicht möglich – ein Interface cannot provide
.
Ist es möglich, abstrakte und endgültige Klassen in Java zu erstellen?
- Das Abstrakte und das Endgültige sind das sich gegenseitig ausschließende Konzept.
- Die Antwort ist also NEIN, wir können eine abstrakte Klasse oder Methode in Java nicht final machen.
- Die Abschlussklasse ist eine abgeschlossene Klasse und kann nicht verlängert werden.
- Eine abstrakte Klasse wird als unvollständige Klasse bezeichnet und kann nur durch andere konkrete Klassen erweitert werden, und Sie müssen alle abstrakten Methoden implementieren.
- Außerdem gibt es keine Möglichkeit und es ist nicht möglich, eine abstrakte Methode in einer finalen Klasse zu haben.
Ist es möglich, in Java von mehreren abstrakten Klassen zu erben?
- Java unterstützt keine Mehrfachvererbung.
- In Java können wir nur eine einzelne Klasse erweitern.
- In Java können wir Schnittstellen aus vielen Quellen implementieren.