ไม่ได้ Top-Level Class (Class ที่ไม่ได้อยู่ใน Class อื่น) ไม่สามารถเป็น private หรือ protected ได้ มีได้แค่ public หรือ default (package-private)
Error Messages
// Private Top-Level Class
private class PrivateClassTest { }
// Error: modifier private not allowed here
// Protected Top-Level Class
protected class ProtectedClassTest { }
// Error: modifier protected not allowed here
เหตุผล
- Private = เข้าถึงได้เฉพาะใน Class เดียวกัน → Top-Level Class ไม่มี "Outer Class" ให้ Private ต่อ
- Protected = เข้าถึงได้ใน Package เดียว + Subclass (แม้ Package ต่าง) → Top-Level Class ไม่มี Superclass ใน Source File
- Java Language Spec ระบุ Modifier ที่อนุญาต: public, abstract, final, strictfp (และไม่มี Modifier = Default)
ตัวอย่างที่ Valid
// Public Top-Level Class
public class PublicClass { }
// Default (Package-Private) Top-Level Class
class DefaultClass { }
// Abstract Top-Level Class
public abstract class AbstractClass { }
// Final Top-Level Class
public final class FinalClass { }
Inner Class (Nested Class) - ใช้ Private/Protected ได้
public class OuterClass {
// Private Inner Class - OK!
private class PrivateInner { }
// Protected Inner Class - OK!
protected class ProtectedInner { }
// Public Inner Class - OK!
public class PublicInner { }
// Default Inner Class - OK!
class DefaultInner { }
// Static Nested Class - OK!
private static class PrivateStaticNested { }
}
กฎเพิ่มเติม
- หนึ่ง Source File (.java) มี ได้หลาย Top-Level Class แต่ Public ได้สูงสุด 1 ตัว
- ถ้ามี Public Class ชื่อ File ต้องตรงกับ Public Class นั้น
- Default Class หลายตัวใน File เดียวได้ ไม่มีข้อจำกัดชื่อไฟล์
สรุป Modifier สำหรับ Top-Level Class
| Modifier | Allowed? | หมายเหตุ |
|---|---|---|
| public | ✅ Yes | เข้าถึงได้ทุกที่ |
| default (none) | ✅ Yes | Package-Private |
| abstract | ✅ Yes | ไม่ new ได้ ต้อง Extend |
| final | ✅ Yes | ไม่ Extend ได้ |
| strictfp | ✅ Yes | FP Strictness |
| private | ❌ No | Compile Error |
| protected | ❌ No | Compile Error |
| static | ❌ No | เฉพาะ Nested Class เท่านั้น |