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

Enum สามารถ Extends Class ได้หรือไม่ใน Java?

คำตอบ: ไม่ได้ Enum ใน Java Implicitly Extends java.lang.Enum แล้ว และ Java ไม่รองรับ Multiple Inheritance สำหรับ Class

รายละเอียด

  • ทุก Enum คอมไพล์แล้วจะกลายเป็น Class ที่ extends Enum<E>
  • Java Class 繼承ได้เพียง Class เดียว (Single Inheritance)
  • ดังนั้น Enum ไม่สามารถ Extends Class อื่นเพิ่มเติมได้

ตัวอย่างที่ Error

class Sample {
    void hello() {}
}

// Compile Error!
enum Scooters extends Sample {
    HONDA, YAMAHA, SUZUKI
}

Compile Error

EnumExample.java:5: error: '{' expected
enum Scooters extends Sample{
    ^
EnumExample.java:5: error: ',', '}', or ';' expected
enum Scooters extends Sample{
    ^

แต่ Enum สามารถ Implements Interface ได้!

interface Drivable {
    void drive();
}

enum Vehicle implements Drivable {
    CAR {
        public void drive() { System.out.println("Driving Car"); }
    },
    BIKE {
        public void drive() { System.out.println("Riding Bike"); }
    };
    // ต้อง Implement Abstract Method ของ Interface
    public abstract void drive();
}

public class EnumImplementsInterface {
    public static void main(String[] args) {
        Vehicle.CAR.drive();  // Driving Car
        Vehicle.BIKE.drive(); // Riding Bike
    }
}

สิ่งที่ Enum ทำได้ (แม้ Extends Class ไม่ได้)

  • Implements Interface (หลาย Interface ได้)
  • มี Field, Method, Constructor (Private/ Package-private Only)
  • Override Method ของ Enum Class (เช่น toString(), compareTo())
  • มี Constant-specific Body (Anonymous Class ต่อ Constant)

ตัวอย่าง Enum สมบูรณ์

enum Planet implements Comparable<Planet> {
    MERCURY(3.303e+23, 2.4397e6),
    VENUS(4.869e+24, 6.0518e6),
    EARTH(5.976e+24, 6.37814e6);
    
    private final double mass;
    private final double radius;
    
    Planet(double mass, double radius) {
        this.mass = mass;
        this.radius = radius;
    }
    
    public double surfaceGravity() {
        return 6.67300E-11 * mass / (radius * radius);
    }
    
    @Override
    public String toString() {
        return name() + " (g=" + surfaceGravity() + ")";
    }
}

สรุป

  • Enum extends java.lang.Enum อัตโนมัติ
  • ไม่สามารถ Extends Class อื่นได้ (Single Inheritance)
  • สามารถ Implements Interface ได้หลายตัว
  • ใช้ Interface แทนการ Extends Class เพื่อ Polymorphism