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

ประกาศ Top-Level Class เป็น Protected หรือ Private ใน Java ได้ไหม?

ไม่ได้ 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

ModifierAllowed?หมายเหตุ
public✅ Yesเข้าถึงได้ทุกที่
default (none)✅ YesPackage-Private
abstract✅ Yesไม่ new ได้ ต้อง Extend
final✅ Yesไม่ Extend ได้
strictfp✅ YesFP Strictness
private❌ NoCompile Error
protected❌ NoCompile Error
static❌ Noเฉพาะ Nested Class เท่านั้น