O que é uma classe abstrata e um método abstrato em Java? Quando devo usar? Tutorial anexado
Publicados: 2019-09-12
Alguns dias atrás eu escrevi um artigo sobre Java Fundamental básico sobre O que é uma interface em Java e como ela é usada? Este tutorial também está relacionado aos fundamentos básicos de Java “ Abstract Class and Abstract Method
”.
O que é uma classe abstrata?
Vamos começar a entender a classe Abstract primeiro e então vamos passar por Example.
- Uma classe abstrata é uma classe que é declarada
abstract
- Classes abstratas não podem ser instanciadas
- Classes abstratas podem ser subclassificadas
- Pode ou não incluir métodos abstratos
- Quando uma classe abstrata é
subclassed
, a subclasse geralmente fornece implementações para todos os métodos abstratos em sua classe pai. - Se a subclasse não fornecer implementações, a subclasse também deverá ser declarada como
abstract
.
Esta é uma basic Java Interview Question
. Provavelmente a 1 st Java Interview Question
que você recebe durante a entrevista.
Posso definir uma classe abstrata sem adicionar um método abstrato?
Claro que sim. Declarar uma classe abstrata significa apenas que você não permite que ela seja instanciada por conta própria. Você não pode ter um método abstrato em uma classe não abstrata.
O que é um método abstrato?
- Um
abstract method
é um método que é declarado sem uma implementação. - Ele só tem uma assinatura 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 ( ) ; } |
Vamos começar com um Exemplo. Descrição do Problema:
- Crie a classe
CrunchifyExam.java
, que tem um método abstrato chamadocheckResult()
- Crie a classe
Crunchify1stSchoolExamResult.java
, que estende a classe abstrataCrunchifyExam.java
- Crie a classe
Crunchify2ndSchoolExamResult.java
, que estende a classe abstrataCrunchifyExam.java
- Agora ambas as classes acima precisam fornecer implementação para o método checkResult()
- Ambas as escolas podem ter seu próprio
procedure
ounumber of checks
diferentes para descobrir se o usuário éPASSED or FAILED
, elas são livres para ter sua própria implementação decheckResult()
Depois de estender a classe CrunchifyExam
em Crunchify1stSchoolExamResult.java
– o Eclipse solicitará que você implemente métodos abstratos mencionados em 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 ( ) ) ; } } |
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 ) ; } } |
Resultado do Console do Eclipse:
Basta clicar com o botão direito do mouse em Crunchify2ndSchoolExamResult.java
e executar como Java Application
para ver o resultado abaixo.

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 |
Agora você pode ter uma pergunta
Por que não posso usar a interface aqui em vez de ter Abstract Method
e Class
e ter CrunchifyExam como uma interface?
Bem – Sure you could
– mas você também precisaria implementar os getExamTime
(), setExamTime
(), getExamTime
(), setExamTime
().
Usando classes abstratas, você pode herdar a implementação de outros métodos (não abstratos). Você não pode fazer isso com interfaces – uma interface cannot provide
nenhuma implementação de método.
É possível criar classe abstrata e final em Java?
- O resumo e o final são o conceito mutuamente exclusivo.
- Então a resposta é NÃO, não podemos fazer uma classe abstrata ou um método final em Java.
- A aula final é uma aula completa e não pode ser estendida.
- A classe abstrata é chamada de classe incompleta e só pode ser estendida por outra classe concreta e você precisa implementar todos os métodos abstratos.
- Além disso, não há como e não é possível ter um método abstrato em uma classe final.
É possível herdar de várias classes abstratas em Java?
- Java não suporta herança múltipla.
- Em java só podemos estender uma única classe.
- Em Java podemos implementar Interfaces de muitas fontes.