Что такое абстрактный класс и абстрактный метод в Java? Когда я должен использовать его? Учебник прилагается
Опубликовано: 2019-09-12
Пару дней назад я написал статью об основных принципах Java о том, что такое интерфейс в Java и как он используется? Этот учебник также связан с базовыми основами Java « Abstract Class and Abstract Method
».
Что такое абстрактный класс?
Давайте сначала начнем понимать абстрактный класс, а затем мы рассмотрим пример.
- Абстрактный класс — это класс, объявленный
abstract
- Абстрактные классы не могут быть созданы
- Абстрактные классы могут быть подклассами
- Он может включать или не включать абстрактные методы
- Когда абстрактный класс является
subclassed
, подкласс обычно предоставляет реализации для всех абстрактных методов в его родительском классе. - Если подкласс не предоставляет реализации, то подкласс также должен быть объявлен
abstract
.
Это очень basic Java Interview Question
. Вероятно, это 1 st Java Interview Question
, который вы получаете во время собеседования.
Могу ли я определить абстрактный класс без добавления абстрактного метода?
Да конечно. Объявление абстрактного класса означает только то, что вы не позволяете создавать его экземпляры сами по себе. У вас не может быть абстрактного метода в неабстрактном классе.
Что такое абстрактный метод?
-
abstract method
— это метод, объявленный без реализации. - У него просто есть сигнатура метода.
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 ( ) ; } |
Начнем с примера. Описание проблемы:
- Создайте класс
CrunchifyExam.java
с одним абстрактным методомcheckResult()
- Создайте класс
Crunchify1stSchoolExamResult.java
, который расширяет абстрактный классCrunchifyExam.java
- Создайте класс
Crunchify2ndSchoolExamResult.java
, который расширяет абстрактный классCrunchifyExam.java
- Теперь оба вышеуказанных класса должны обеспечить реализацию метода checkResult().
- Обе школы могут иметь свою собственную
procedure
илиnumber of checks
, чтобы узнать, прошел ли пользовательPASSED or FAILED
, они могут иметь свою собственную реализациюcheckResult()
Как только вы расширите класс CrunchifyExam
в Crunchify1stSchoolExamResult.java
, Eclipse предложит вам реализовать абстрактные методы, упомянутые в CrunchifyExam.java

Crunchify1 -й 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- й 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 ) ; } } |
Результат консоли Eclipse:
Просто щелкните правой кнопкой мыши Crunchify2ndSchoolExamResult.java
и запустите как Java Application
, чтобы увидеть результат ниже.

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 |
Теперь у вас может возникнуть вопрос
Почему я не могу использовать интерфейс здесь, а не использовать Abstract Method
и Class
и использовать CrunchifyExam в качестве интерфейса?
Что ж Sure you could
но вам также потребуется реализовать getExamTime
(), setExamTime
(), getExamTime
(), setExamTime
().
Используя абстрактные классы, вы можете наследовать реализацию других (не абстрактных) методов. Вы не можете сделать это с интерфейсами — интерфейс cannot provide
никаких реализаций методов.
Можно ли создать абстрактный и окончательный класс в Java?
- Абстрактное и конечное являются взаимоисключающими понятиями.
- Итак, ответ НЕТ, мы не можем сделать абстрактный класс или метод окончательным в Java.
- Заключительный класс является полным классом и не может быть расширен.
- Абстрактный класс называется неполным классом и может быть расширен только другим конкретным классом, и вы должны реализовать все абстрактные методы.
- Кроме того, нет никакого способа и невозможно иметь абстрактный метод в финальном классе.
Можно ли наследовать от нескольких абстрактных классов в Java?
- Java не поддерживает множественное наследование.
- В Java мы можем расширить только один класс.
- В Java мы можем реализовать интерфейсы из многих источников.