คำตอบสั้น: เพราะ Constructor ไม่ถูกสืบทอด (Not Inherited) ดังนั้นการ Override Constructor จึงไม่มีอยู่จริง ทำให้ final (ซึ่งใช้ป้องกัน Override) ไม่มีความหมาย
เหตุผลลึกๆ
- วัตถุประสงค์ของ final method = ป้องกันไม่ให้ Subclass Override
- Constructor ไม่ถูกสืบทอด - Subclass ไม่ได้รับ Constructor จาก Superclass
- Subclass ต้องประกาศ Constructor เอง (อาจเรียก
super()) - ไม่มีการ "Override Constructor" เลย ->
finalไม่มีบทบาท
ตัวอย่างที่ Error
public class Student {
public final String name;
public final int age;
// Compile Error: modifier final not allowed here
public final Student() {
this.name = "Raju";
this.age = 20;
}
}
Compile Error
Student.java:6: error: modifier final not allowed here
public final Student(){
^
เปรียบเทียบกับ Method ปกติ
| ลักษณะ | Method | Constructor |
|---|---|---|
| ถูกสืบทอด? | ใช่ (ยกเว้น private) | ไม่ |
| สามารถ Override? | ได้ | ไม่ได้ (Overriding ไม่มีอยู่) |
| final มีความหมาย? | มี (ป้องกัน Override) | ไม่มี |
| final allowed? | ได้ | ไม่ได้ (Compile Error) |
สรุป
Constructor ใช้สำหรับ Initialize Object ไม่ใช่พฤติกรรมที่สืบทอดได้ Java จึง запрет final modifier บน Constructor เพราะมันไม่มีความหมายทาง Logic และอาจสร้างความสับสน