Co to jest klasa abstrakcyjna i metoda abstrakcyjna w Javie? Kiedy powinienem go używać? Załączono samouczek
Opublikowany: 2019-09-12
Kilka dni temu napisałem artykuł na temat podstawowych podstaw Java na temat Co to jest interfejs w Javie i jak go używać? Ten samouczek jest również powiązany z podstawowymi podstawami Javy „ Abstract Class and Abstract Method
”.
Co to jest klasa abstrakcyjna?
Zacznijmy najpierw rozumieć klasę abstrakcyjną, a następnie omówimy Przykład.
- Klasa abstrakcyjna to klasa zadeklarowana jako
abstract
- Klasy abstrakcyjne nie mogą być tworzone
- Klasy abstrakcyjne mogą być podzielone na podklasy
- Może, ale nie musi zawierać abstrakcyjnych metod
- Kiedy klasa abstrakcyjna jest
subclassed
, podklasa zwykle dostarcza implementacje dla wszystkich metod abstrakcyjnych w swojej klasie nadrzędnej - Jeśli podklasa nie zapewnia implementacji, podklasa musi być również zadeklarowana jako
abstract
.
To jest bardzo basic Java Interview Question
. Prawdopodobnie pierwsze 1 st Java Interview Question
, które otrzymasz podczas rozmowy kwalifikacyjnej.
Czy mogę zdefiniować klasę abstrakcyjną bez dodawania metody abstrakcyjnej?
Oczywiście, że tak. Zadeklarowanie abstraktu klasy oznacza tylko, że nie zezwalasz na jego samodzielne tworzenie. Nie możesz mieć metody abstrakcyjnej w klasie nieabstrakcyjnej.
Co to jest metoda abstrakcyjna?
-
abstract method
to metoda zadeklarowana bez implementacji. - Ma tylko sygnaturę metody.
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 ( ) ; } |
Zacznijmy od przykładu. Opis problemu:
- Utwórz klasę
CrunchifyExam.java
, która ma jedną abstrakcyjną metodę o nazwiecheckResult()
- Utwórz klasę
Crunchify1stSchoolExamResult.java
, która rozszerza klasę abstrakcyjnąCrunchifyExam.java
- Utwórz klasę
Crunchify2ndSchoolExamResult.java
, która rozszerza klasę abstrakcyjnąCrunchifyExam.java
- Teraz obie powyższe klasy muszą zapewnić implementację metody checkResult()
- Obie szkoły mogą mieć własne różne
procedure
lubnumber of checks
aby dowiedzieć się, czy użytkownik jestPASSED or FAILED
, mogą mieć własną implementacjęcheckResult()
Po rozszerzeniu klasy CrunchifyExam
w Crunchify1stSchoolExamResult.java
– Eclipse poprosi o zaimplementowanie metod Abstract wymienionych w 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 ( ) ) ; } } |
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 ) ; } } |
Wynik konsoli Eclipse:
Wystarczy kliknąć prawym przyciskiem myszy Crunchify2ndSchoolExamResult.java
i uruchomić jako Java Application
, aby zobaczyć poniższy wynik.

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 |
Teraz możesz mieć pytanie
Dlaczego nie mogę użyć tutaj interfejsu zamiast Abstract Method
i Class
, a CrunchifyExam jako interfejsu?
No cóż – Sure you could
– ale trzeba by też zaimplementować metody getExamTime
(), setExamTime
(), getExamTime
(), setExamTime
().
Używając klas abstrakcyjnych, można dziedziczyć implementację innych (nieabstrakcyjnych) metod. Nie możesz tego zrobić z interfejsami — interfejs cannot provide
żadnych implementacji metod.
Czy można stworzyć abstrakcyjną i końcową klasę w Javie?
- Abstrakt i finał to pojęcie wzajemnie się wykluczające.
- Tak więc odpowiedź brzmi NIE, nie możemy zrobić ostatecznej klasy lub metody w Javie.
- Zajęcia końcowe to zajęcia pełne i nie można ich dalej przedłużać.
- Klasa abstrakcyjna nazywana jest klasą niekompletną i może być rozszerzona tylko o inną klasę konkretną i musisz zaimplementować wszystkie metody abstrakcyjne.
- Poza tym nie ma sposobu i nie jest możliwe, aby w końcowej klasie znajdowała się metoda abstrakcyjna.
Czy możliwe jest dziedziczenie z wielu klas abstrakcyjnych w Javie?
- Java nie obsługuje wielokrotnego dziedziczenia.
- W javie możemy rozszerzyć tylko jedną klasę.
- W Javie możemy zaimplementować interfejsy z wielu źródeł.