Computer >> บทช่วยสอนคอมพิวเตอร์ >  >> การเขียนโปรแกรม >> Java

Java Abstract Class: คลาสและเมธอดนามธรรม (Abstraction)

วิธีใช้ Abstract Classes และ Methods ใน Java

Abstraction (การนามธรรม) เป็นหนึ่งใน 3 หลักการหลักของ Object-Oriented Programming — พร้อมกับ Encapsulation และ Inheritance

Abstraction เป็นวิธีลดความซับซ้อนของโปรแกรม และทำให้โค้ดอ่านง่ายขึ้น ใน Java Abstraction ช่วยให้คุณ:

  1. แสดงรายละเอียดบางส่วนของคลาสเท่านั้น และ
  2. ซ่อนรายละเอียดอื่นๆ ของคลาสนั้นไว้

Abstraction ใช้ได้กับทั้งคลาสและเมธอดใน Java

บทช่วยสอนนี้จะอธิบายพื้นฐาน Abstraction ใน Java วิธีใช้ Abstract Classes และ Abstract Methods พร้อมตัวอย่าง เพื่อให้เข้าใจแนวคิดสำคัญนี้ได้ดีขึ้น

Java Abstraction

Object-Oriented Programming ใช้ Objects และ Classes แทนข้อมูลและเมธอด ช่วยลดการซ้ำของโค้ด และทำให้โปรแกรมมีประสิทธิภาพมากขึ้น

Java เป็นภาษา OOP จึงมีฟีเจอร์สำหรับทำงานกับ Objects และ Classes Abstraction เป็นหนึ่งในฟีเจอร์เหล่านั้น ช่วยให้คุณแสดงข้อมูลบางส่วนให้คลาสใน Java

มี 2 กรณีที่ใช้ Abstraction ใน Java: ในคลาส และในเมธอด

Java Abstract Classes

ใน Java Abstract Class คือคลาสที่ ไม่สามารถสร้างอ็อบเจ็กต์ (instantiate) ได้ กล่าวคือ ไม่สามารถ new Abstract Class ได้

เพื่อสร้าง Abstract Class ใน Java ใช้คีย์เวิร์ด abstract ตัวอย่าง:

abstract class BankAccount {
    // Code here
}

เนื่องจากเป็น abstract class หากลองสร้างอ็อบเจ็กต์จากคลาสนี้ โปรแกรมจะ error

เช่น ลองสร้างอินสแตนซ์ของ BankAccount ชื่อ lucyAccount เก็บข้อมูลธนาคารของลูซี่ (ลูกค้า) ใช้โค้ด:

BankAccount lucyAccount = new BankAccount();

รันแล้ว error:

BankAccount is abstract; cannot be instantiated

ดูได้ว่า ไม่สามารถกำหนด abstract class ให้อ็อบเจ็กต์ได้

แต่ ยังสามารถสร้าง subclass จาก abstract class ได้ ในส่วนต่อไป จะอธิบายวิธีสร้าง subclass จาก abstract class

Abstract Class Inheritance (การสืบทอดคลาสนามธรรม)

เนื่องจากไม่สามารถกำหนดอ็อบเจ็กต์เป็น abstract class ได้ เพื่อเข้าถึงเนื้อหาของ abstract class — คือ attributes และ methods ของคลาสนั้น — เราต้อง inherit (สืบทอด) คลาสนั้น

ตัวอย่าง: สร้างโปรแกรมจัดเก็บข้อมูลบัญชีธนาคาร มี 2 คลาส: BankAccount และ CheckingAccount BankAccount เป็น parent class เก็บ attributes และ methods สำหรับทำงานกับบัญชี CheckingAccount เป็น child class สืบทอดเมธอดเหล่านั้น

ในตัวอย่างนี้ BankAccount เป็น abstract class เราต้องการใช้สร้าง checking accounts เท่านั้น

abstract class BankAccount {
    public void viewAccountNumber() {
        System.out.println("Account number: #1932042");
    }
}
class CheckingAccount extends BankAccount {
}
class Main {
    public static void main(String[] args) {
        CheckingAccount lucyAccount = new CheckingAccount();
        lucyAccount.viewAccountNumber();
    }
}

ผลลัพธ์: Account number: #1932042

ในตัวอย่าง สร้าง 3 คลาส:

  1. BankAccount abstract class มีเมธอด viewAccountNumber() เนื่องจากเป็น abstract ไม่สามารถสร้างอ็อบเจ็กต์ได้
  2. CheckingAccount child class สืบทอด attributes และ methods ของ BankAccount
  3. Main คลาสมีโค้ดโปรแกรมหลัก

ใน main สร้างอินสแตนซ์ CheckingAccount ชื่อ lucyAccount เรียกเมธอด viewAccountNumber()

ตารางสรุปส่วนสำคัญ:

NAMETYPEDESCRIPTION
BankAccountabstract/parent classจัดเก็บ attributes และ methods สำหรับทำงานกับบัญชีธนาคาร
CheckingAccountchild classสืบทอดเมธอดของ parent class
Mainclassมีโค้ดโปรแกรมหลัก
lucyAccountobjectการประยุกต์ใช้งานจริงของโปรแกรม

สนใจ Inheritance ใน Java เพิ่มเติม? อ่านคู่มือฉบับสมบูรณ์ได้ที่นี่

Java Abstract Methods

นอกจากคลาส เมธอดก็สามารถเป็น abstract ได้

ตอนประกาศ abstract method ใช้คีย์เวิร์ด abstract เดียวกัน ไม่ระบุ body (ไม่มีโค้ดในเมธอด) และประกาศ abstract method ได้เฉพาะใน abstract class เท่านั้น

ตัวอย่าง abstract method:

abstract void checkBalance();

สร้าง abstract method checkBalance() ไม่มี body — ไม่มีโค้ดในเมธอด

กลับไปที่ตัวอย่างธนาคารก่อนหน้า โปรแกรมนั้นมี abstract method: lucyAccount.viewAccountNumber();

เราใช้ abstract method นี้เพื่อให้โปรแกรมแสดงหมายเลขบัญชีของลูกค้า ในตัวอย่างก่อนหน้า BankAccount parent class เป็นแม่แบบ (template) สำหรับ child class(es)

Child classes คือประเภทบัญชีต่างๆ เพราะลูกค้าอาจมีหลายประเภทบัญชี และเราอาจต้องทำฟังก์ชันเดียวกันกับทุกประเภท Child class ที่สร้างคือ CheckingAccount

ลูกค้า Lucy มี checking account แต่อาจมี savings account และ brokerage account ด้วย เราต้องการแสดงหมายเลขบัญชีของทุกประเภท สามารถทำได้โดยสร้าง child classes เพิ่ม: SavingsAccount, BrokerageAccount

เนื่องจากสร้าง BankAccount parent class แล้ว เราสามารถแสดงหมายเลขบัญชีทั้ง 3 ประเภทได้อย่างมีประสิทธิภาพ และลดการซ้ำของโค้ด

ในโค้ดด้านล่าง ใช้คีย์เวิร์ด abstract 2 ครั้ง: 1) ประกาศ abstract class (BankAccount) 2) ประกาศ abstract method ช่วยโปรแกรมแสดงหมายเลขบัญชี คือ abstract void viewAccountNumber(); แล้ว implement viewAccountNumber() บน CheckingAccount child class:

abstract class BankAccount {
    abstract void viewAccountNumber();
}
class CheckingAccount extends BankAccount {
    public void viewAccountNumber() {
        System.out.println("Checking account number: #1932042");
    }
}
class Main {
    public static void main(String[] args) {
        CheckingAccount lucyAccount = new CheckingAccount();
        lucyAccount.viewAccountNumber();
    }
}

ผลลัพธ์: Checking account number: #1932042

ตัวอย่างนี้ให้ผลลัพธ์เหมือนตัวอย่างก่อนหน้า แต่มีความแตกต่างของโค้ด:

  1. การประกาศ abstract method. ประกาศ abstract class BankAccount มี abstract method viewAccountNumber()
  2. การขยาย abstract method. ขยาย BankAccount ผ่าน CheckingAccount ซึ่งสืบทอดค่าจาก BankAccount method

ใน CheckingAccount กำหนดเมธอด viewAccountNumber() ที่เข้าถึงได้เฉพาะ CheckingAccount objects แล้วสร้าง CheckingAccount object เพื่อดูหมายเลขบัญชี

Java Abstraction Example (ตัวอย่างสมบูรณ์)

ตอนนี้เราเข้าใจ Abstract Classes และ Methods แล้ว มารวมทุกอย่างในตัวอย่างสมบูรณ์ของ Abstraction ใน Java

สมมติเราดำเนินธนาคารที่มี 2 ประเภทบัญชี: checking และ savings ตัดสินใจเขียนโปรแกรมให้เจ้าของบัญชีเช็คหมายเลขบัญชีได้

ที่ธนาคารนี้: ถ้าเป็น checking account หมายเลขบัญชีเริ่มต้นด้วย ID ลูกค้า และลงท้าย 555 ถ้าเป็น savings account ลงท้าย 777

โค้ดสำหรับโปรแกรมนี้:

abstract class BankAccount {
    abstract void viewAccountNumber();
}
class CheckingAccount extends BankAccount {
    public void viewAccountNumber() {
        System.out.println("Checking account number: #1932042555");
    }
}
class SavingsAccount extends BankAccount {
    public void viewAccountNumber() {
        System.out.println("Savings account number: #1932042777");
    }
}
class Main {
    public static void main(String[] args) {
        CheckingAccount ellieCheckingAccount = new CheckingAccount();
        ellieCheckingAccount.viewAccountNumber();
        SavingsAccount ellieSavingsAccount = new SavingsAccount();
        ellieSavingsAccount.viewAccountNumber();
    }
}

ผลลัพธ์:

Checking account number: #1932042555
Savings account number: #1932042777

ในตัวอย่าง สร้างคลาส BankAccount มี abstract method viewAccountNumber()

แต่ละประเภทบัญชีกำหนดหมายเลขต่างกัน จึงไม่สามารถ implement viewAccountNumber() ใน BankAccount ได้ แต่แต่ละ subclass จะ implement เอง

CheckingAccount: เริ่ม ID ลูกค้า ลงท้าย 555
SavingsAccount: เริ่ม ID ลูกค้า ลงท้าย 777

ในโค้ด สร้างอินสแตนซ์ CheckingAccount สำหรับลูกค้า Ellie ชื่อ ellieCheckingAccount เรียก viewAccountNumber() ได้ผลลัพธ์:

Checking account number: #1932042555

สร้างอินสแตนซ์ SavingsAccount ชื่อ ellieSavingsAccount เรียก viewAccountNumber() ได้:

Savings account number: #1932042777

สรุป

Abstraction เป็นฟีเจอร์สำคัญของ OOP ช่วยซ่อนรายละเอียดบางส่วนในคลาสหรือเมธอด และแสดงเฉพาะข้อมูลที่จำเป็น ในการสร้าง abstract classes และ methods ใน Java ใช้คีย์เวิร์ด abstract

บทช่วยสอนนี้อธิบายพร้อมตัวอย่าง: Abstraction ทำงานยังไง ทำไมมีประโยชน์ และวิธีสร้าง abstract methods และ classes ใน Java ตอนนี้คุณพร้อมทำงานกับ abstract classes และ methods ใน Java อย่างมืออาชีพแล้ว!