Javaの抽象クラスと抽象メソッドとは何ですか? いつ使うべきですか? チュートリアルを添付
公開: 2019-09-12
数日前、私はJavaの基本的な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 ( ) ; } |
例から始めましょう。 問題の説明:
-
checkResult()
と呼ばれる1つの抽象メソッドを持つクラスCrunchifyExam.java
を作成します。 - 抽象クラス
CrunchifyExam.java
を拡張するクラスCrunchify1stSchoolExamResult.java
を作成します - 抽象クラス
CrunchifyExam.java
を拡張するクラスCrunchify2ndSchoolExamResult.java
を作成します - 上記の両方のクラスは、checkResult()メソッドの実装を提供する必要があります
- どちらの学校も、ユーザーが合格か不合格かを確認するための独自の
procedure
またはnumber of checks
持っている場合があり、PASSED or FAILED
checkResult()
の独自の実装を自由に行うことができます。
Crunchify1stSchoolExamResult.javaでCrunchifyExam
クラスを拡張すると、EclipseはCrunchify1stSchoolExamResult.java
に記載されている抽象メソッドを実装するように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 ) ; } } |
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で抽象クラスと最終クラスを作成することは可能ですか?
- 抽象と最終は相互に排他的な概念です。
- したがって、答えはNOです。Javaで抽象クラスまたはメソッドをfinalにすることはできません。
- 最終クラスは完全なクラスであり、これ以上拡張することはできません。
- 抽象クラスは不完全クラスと呼ばれ、他の具象クラスによってのみ拡張でき、すべての抽象メソッドを実装する必要があります。
- また、方法はなく、最終クラスに抽象メソッドを含めることはできません。
Javaの複数の抽象クラスから継承することは可能ですか?
- Javaは多重継承をサポートしていません。
- Javaでは、単一のクラスのみを拡張できます。
- Javaでは、多くのソースからインターフェースを実装できます。