¿Qué es una clase abstracta y un método abstracto en Java? ¿Cuándo debo usarlo? Tutorial adjunto
Publicado: 2019-09-12
Hace un par de días escribí un artículo sobre los fundamentos básicos de Java sobre ¿Qué es una interfaz en Java y cómo se usa? Este tutorial también está relacionado con la " Abstract Class and Abstract Method
" fundamentales de Java.
¿Que es una clase abstracta?
Comencemos a entender primero la clase abstracta y luego repasaremos el ejemplo.
- Una clase abstracta es una clase que se declara
abstract
- Las clases abstractas no se pueden instanciar.
- Las clases abstractas se pueden subclasificar
- Puede o no incluir métodos abstractos.
- Cuando se
subclassed
una clase abstracta, la subclase generalmente proporciona implementaciones para todos los métodos abstractos en su clase principal. - Si la subclase no proporciona implementaciones, la subclase también debe declararse
abstract
.
Esta es una basic Java Interview Question
. Probablemente la 1 st Java Interview Question
que recibe durante la entrevista.
¿Puedo definir una clase abstracta sin agregar un método abstracto?
Por supuesto que sí. Declarar una clase como abstracta solo significa que no permite que se cree una instancia por sí sola. No puede tener un método abstracto en una clase no abstracta.
¿Qué es un método abstracto?
- Un
abstract method
es un método que se declara sin una implementación. - Solo tiene una firma de método.
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 ( ) ; } |
Comencemos con un ejemplo. Descripción del problema:
- Cree la clase
CrunchifyExam.java
, que tiene un método abstracto llamadocheckResult()
- Cree la clase
Crunchify1stSchoolExamResult.java
, que amplía la clase AbstractCrunchifyExam.java
- Cree la clase
Crunchify2ndSchoolExamResult.java
, que amplía la clase AbstractCrunchifyExam.java
- Ahora las dos clases anteriores tienen que proporcionar implementación para el método checkResult()
- Ambas escuelas pueden tener su propio
procedure
diferente onumber of checks
para averiguar si el usuarioPASSED or FAILED
, son libres de tener su propia implementación decheckResult()
Una vez que extienda la clase CrunchifyExam
en Crunchify1stSchoolExamResult.java
, Eclipse le pedirá que implemente los métodos abstractos mencionados en 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 ) ; } } |
Resultado de la consola de Eclipse:
Simplemente haga clic derecho en Crunchify2ndSchoolExamResult.java
y ejecútelo como Java Application
para ver el resultado a continuación.

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 |
Ahora usted puede tener una pregunta
¿Por qué no puedo usar la interfaz aquí en lugar de tener el Abstract Method
y Class
abstractos y tener CrunchifyExam como interfaz?
Bueno, Sure you could
, pero también necesitaría implementar los getExamTime
(), setExamTime
(), getExamTime
(), setExamTime
().
Mediante el uso de clases abstractas, puede heredar la implementación de otros métodos (no abstractos). No puede hacer eso con las interfaces: una interfaz cannot provide
ninguna implementación de método.
¿Es posible crear una clase abstracta y final en Java?
- Lo abstracto y lo final son el concepto mutuamente excluyente.
- Entonces, la respuesta es NO, no podemos hacer que una clase o método abstracto sea final en Java.
- La clase final es una clase completa y no puede extenderse más.
- La clase abstracta se llama clase incompleta y solo puede extenderse con otra clase concreta y debe implementar todos los métodos abstractos.
- Además, no hay forma ni es posible tener un método abstracto en una clase final.
¿Es posible heredar de múltiples clases abstractas en Java?
- Java no admite la herencia múltiple.
- En Java solo podemos extender una sola clase.
- En Java podemos implementar interfaces de muchas fuentes.