ทั้งสองกำหนดประเภทนามธรรมที่ไม่สามารถสร้างอินสแตนซ์โดยตรงได้และมีวัตถุประสงค์ให้实施/ขยาย — แต่ทั้งสองมีวัตถุประสงค์ในการออกแบบที่แตกต่างกัน ความแตกต่างหลักคือ การสืบทอดหลายแบบ, สถานะ และความสัมพันธ์ที่ออกแบบแนวคิด
Interface — สัญญา ("สามารถทำได้" / ความสามารถ)
public interface Drawable {
void draw(); // abstract method (implicitly public abstract)
default void render() { // default method — has a body (Java 8+)
System.out.println("rendering");
}
int MAX = 100; // implicitly public static final (constant only)
}
class Circle implements Drawable {
public void draw() { /* must implement */ }
}
อินเทอร์เฟส กำหนด สัญญา ของลักษณะการทำงาน คลาสสามารถใช้งาน หลาย อินเทอร์เฟส — นี่คือวิธีที่ Java บรรลุรูปแบบของการสืบทอดหลายแบบ อินเทอร์เฟส (ตามปกติ) ไม่มีสถานะอินสแตนซ์
Abstract class — ฐานบางส่วน ("เป็น" ที่มีโค้ดร่วม)
public abstract class Animal {
protected String name; // ✅ can have instance FIELDS (state)
public Animal(String name) { // ✅ can have a constructor
this.name = name;
}
public abstract void makeSound(); // abstract — subclasses must implement
public void sleep() { // ✅ concrete method with shared logic
System.out.println(name + " sleeps");
}
}
class Dog extends Animal { // can extend only ONE class
public Dog(String n) { super(n); }
public void makeSound() { System.out.println("Woof"); }
}
คลาสนามธรรมสามารถเก็บ สถานะ (ฟิลด์), ตัวสร้าง และเมธอดที่เป็นรูปธรรมพร้อมการใช้งานร่วมกัน — แต่คลาสสามารถขยาย หนึ่ง คลาสนามธรรมเท่านั้น (การสืบทอดเดี่ยว)
ความแตกต่างหลัก
Interface Abstract class
Multiple inheritance ✓ (implement many) ✗ (extend only one)
Instance fields/state ✗ (constants only) ✓ (fields)
Constructor ✗ ✓
Method bodies default/static only ✓ (concrete methods)
Models capability ("can-do") "is-a" with shared base
เมื่อใดที่จะใช้แต่ละอัน
Interface → define a capability multiple unrelated classes can have
(Comparable, Runnable, Serializable); when you need multiple inheritance
Abstract class → share common state + code among closely related subclasses
(a base class with fields and partial implementation)
เหตุที่สิ่งนี้สำคัญ
การเลือกระหว่างอินเทอร์เฟสและคลาสนามธรรมเป็นการตัดสินใจพื้นฐานในการออกแบบ Java
อินเทอร์เฟสกำหนด สัญญา/ความสามารถ และช่วยให้คลาสสามารถใช้งานได้หลายแบบ (คำตอบของ Java สำหรับการสืบทอดหลายแบบ) — เหมาะสำหรับความสามารถข้ามโดเมน
คลาสนามธรรมให้ ฐานร่วมพร้อมสถานะและการใช้งานบางส่วน สำหรับคลาสย่อยที่มีความเกี่ยวข้องอย่างใกล้ชิด แต่จำกัดคุณให้เป็นการสืบทอดเดี่ยว
การเข้าใจการแลกเปลี่ยน (การใช้งานหลายแบบกับสถานะ/ตัวสร้างร่วม ความสามารถกับความสัมพันธ์เป็น-ก) นำไปสู่การออกแบบ API และลำดับชั้นคลาสที่ดี
ด้วย Java 8+ เมธอด default ที่ทำให้ขอบเขต คำนวณเมื่อแต่ละอันพอดี — และข้อ จำกัด พื้นฐาน (หนึ่งคลาสนามธรรมแต่หลายอินเทอร์เฟส สถานะในคลาสนามธรรมเท่านั้น) — จำเป็นสำหรับการออกแบบโค้ดที่ยืดหยุ่นและมีโครงสร้างที่ดี
