Ce este o clasă abstractă și o metodă abstractă în Java? Când ar trebui să-l folosesc? Tutorial atasat
Publicat: 2019-09-12
Cu câteva zile în urmă, am scris un articol despre elementele fundamentale ale Java despre Ce este o interfață în Java și cum este utilizată? Acest tutorial este, de asemenea, legat de baza fundamentală Java „ Abstract Class and Abstract Method
”.
Ce este o clasă abstractă?
Să începem să înțelegem mai întâi clasa Abstract și apoi vom trece peste Exemplu.
- O clasă abstractă este o clasă care este declarată
abstract
- Clasele abstracte nu pot fi instanțiate
- Clasele abstracte pot fi subclasate
- Poate include sau nu metode abstracte
- Când o clasă abstractă este
subclassed
, subclasa oferă de obicei implementări pentru toate metodele abstracte din clasa sa părinte. - Dacă subclasa nu oferă implementări, atunci subclasa trebuie de asemenea să fie declarată
abstract
.
Aceasta este o basic Java Interview Question
. Probabil 1 st Java Interview Question
pe care o primiți în timpul interviului.
Pot defini o clasă abstractă fără a adăuga o metodă abstractă?
Desigur ca da. Declararea unui abstract de clasă înseamnă doar că nu permiteți ca aceasta să fie instanțiată pe cont propriu. Nu puteți avea o metodă abstractă într-o clasă non-abstractă.
Ce este o metodă abstractă?
- O
abstract method
este o metodă care este declarată fără o implementare. - Are doar o semnătură de metodă.
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 ( ) ; } |
Să începem cu un Exemplu. Descrierea problemei:
- Creați clasa
CrunchifyExam.java
, care are o metodă abstractă numităcheckResult()
- Creați clasa
Crunchify1stSchoolExamResult.java
, care extinde clasa AbstractCrunchifyExam.java
- Creați clasa
Crunchify2ndSchoolExamResult.java
, care extinde clasa AbstractCrunchifyExam.java
- Acum ambele clase de mai sus trebuie să ofere implementare pentru metoda checkResult().
- Ambele școli pot avea propria lor
procedure
sau unnumber of checks
pentru a afla dacă utilizatorul estePASSED or FAILED
, sunt libere să aibă propria lor implementare acheckResult()
Odată ce extindeți clasa CrunchifyExam
în Crunchify1stSchoolExamResult.java
– Eclipse vă va solicita să implementați metodele Abstract menționate în CrunchifyExam.java

Crunchify1 st 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 ) ; } } |
Rezultat consola Eclipse:
Faceți clic dreapta pe Crunchify2ndSchoolExamResult.java
și rulați ca Java Application
pentru a vedea rezultatul de mai jos.

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 |
Acum este posibil să aveți o întrebare
De ce nu pot folosi Interfața aici în loc să am Abstract Method
și Class
și să am CrunchifyExam ca interfață?
Ei bine – Sure you could
– dar ar trebui să implementezi și getExamTime
(), setExamTime
(), getExamTime
(), setExamTime
().
Folosind clase abstracte, puteți moșteni implementarea altor metode (non-abstracte). Nu puteți face asta cu interfețele – o interfață cannot provide
nicio implementare a metodei.
Este posibil să creați o clasă abstractă și finală în Java?
- Abstractul și finalul sunt conceptul care se exclud reciproc.
- Deci răspunsul este NU, nu putem face o clasă abstractă sau o metodă finală în Java.
- Clasa finală este o clasă completă și nu poate fi prelungită în continuare.
- Clasa abstractă se numește clasă incompletă și poate fi extinsă doar de altă clasă concretă și trebuie să implementați toate metodele abstracte.
- De asemenea, nu există nicio modalitate și nu este posibil să existe o metodă abstractă într-o clasă finală.
Este posibil să moșteniți din mai multe clase abstracte în Java?
- Java nu acceptă moștenirea multiplă.
- În java putem extinde doar o singură clasă.
- În Java putem implementa interfețe din mai multe surse.