Abstract Class และ Abstract Method ใน Java คืออะไร? ฉันควรใช้เมื่อใด แนบการสอน
เผยแพร่แล้ว: 2019-09-12
เมื่อสองสามวันก่อน ฉันเขียนบทความเกี่ยวกับ Java Fundamental พื้นฐานเกี่ยวกับอินเทอร์เฟซใน Java คืออะไรและใช้งานอย่างไร บทช่วยสอนนี้เกี่ยวข้องกับ Java พื้นฐาน " Abstract Class and Abstract Method
" ด้วย
คลาสนามธรรมคืออะไร?
มาเริ่มทำความเข้าใจคลาส Abstract กันก่อน แล้วเราจะมาดูตัวอย่างกัน
- คลาสนามธรรม คือคลาสที่มีการประกาศ
abstract
- ไม่สามารถยกตัวอย่างคลาสนามธรรมได้
- คลาสนามธรรมสามารถจัดคลาสย่อยได้
- อาจรวมหรือไม่มีวิธีการที่เป็นนามธรรมก็ได้
- เมื่อคลาสนามธรรมเป็น
subclassed
คลาสย่อยมักจะจัดเตรียมการใช้งานสำหรับเมธอด abstract ทั้งหมดในคลาสพาเรนต์ - หากคลาสย่อยไม่ได้จัดเตรียมการนำไปใช้งาน คลาสย่อยนั้นจะต้องได้รับการประกาศให้
abstract
ด้วย
นี่เป็น basic Java Interview Question
อาจเป็น 1 st Java Interview Question
ที่คุณได้รับระหว่างการสัมภาษณ์
ฉันสามารถกำหนดคลาสนามธรรมโดยไม่เพิ่มเมธอด abstract ได้หรือไม่
แน่นอนใช่. การประกาศ class abstract หมายความว่าคุณไม่อนุญาตให้สร้างอินสแตนซ์ของมันเอง คุณไม่สามารถมีวิธีนามธรรมในคลาสที่ไม่ใช่นามธรรมได้
วิธีการเชิงนามธรรมคืออะไร?
-
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 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?
- นามธรรมและขั้นสุดท้ายเป็นแนวคิดที่ไม่เกิดร่วมกัน
- คำตอบคือ ไม่ เราไม่สามารถสร้างคลาสนามธรรมหรือเมธอดสุดท้ายใน Java ได้
- คลาสสุดท้ายเป็นคลาสที่สมบูรณ์และไม่สามารถขยายเพิ่มเติมได้อีก
- คลาสนามธรรมเรียกว่าคลาสที่ไม่สมบูรณ์และสามารถขยายได้โดยคลาสที่เป็นรูปธรรมอื่น ๆ เท่านั้นและคุณต้องใช้วิธีนามธรรมทั้งหมด
- นอกจากนี้ยังไม่มีทางและเป็นไปไม่ได้ที่จะมีวิธีการนามธรรมในชั้นเรียนสุดท้าย
เป็นไปได้ไหมที่จะสืบทอดจากคลาสนามธรรมหลายคลาสใน Java?
- Java ไม่รองรับการสืบทอดหลายรายการ
- ใน java เราสามารถขยายได้เพียงคลาสเดียวเท่านั้น
- ใน Java เราสามารถใช้อินเทอร์เฟซจากหลายแหล่ง