在 Java 中用于 类 的修饰符

Modifiers used for Classes in Java

我知道 class 中的 Java 仅使用“public”和“默认(无修饰符)”,当您尝试声明 class作为“私有”或“受保护”,它给出了一个编译错误,这对我来说很有意义。

但是,为什么 this page 说“classes 可以有上述 4 个修饰符中的任何修饰符”。

谁能给我解释一下吗?

如文中所说:

Not all modifiers are allowed on all classes

但是,例如,inner classes 可以是 private/protected。

public class Foo {
    private Bar bar = new Bar(42);

    private static class Bar {
        private int answer;

        Bar(int theAnswer) {
            this.answer = theAnswer;
        }
    }
}

这对于某些保存数据的 POJO 或您想要封装但不会泄漏的某些内部实现细节可能有意义(如果它受到保护,您甚至可以覆盖)。

还有更多的合法组合。只是为了好玩,我写了一个生成所有可能组合的小脚本,然后删除了导致编译错误的那些,这些是我剩下的合法组合:

class Test {
                                             class     Default__ConcreteInstanceVirtualLoosefp_Class     {}
                                             interface Default__ConcreteInstanceVirtualLoosefp_Interface {}
                                             record    Default__ConcreteInstanceVirtualLoosefp_Record()  {}
                                    strictfp class     Default__ConcreteInstanceVirtualStrictfpClass     {}
                                    strictfp interface Default__ConcreteInstanceVirtualStrictfpInterface {}
                                    strictfp record    Default__ConcreteInstanceVirtualStrictfpRecord()  {}
                              final          class     Default__ConcreteInstanceFinal__Loosefp_Class     {}
                              final          record    Default__ConcreteInstanceFinal__Loosefp_Record()  {}
                              final strictfp class     Default__ConcreteInstanceFinal__StrictfpClass     {}
                              final strictfp record    Default__ConcreteInstanceFinal__StrictfpRecord()  {}
                       static                class     Default__ConcreteStatic__VirtualLoosefp_Class     {}
                       static                interface Default__ConcreteStatic__VirtualLoosefp_Interface {}
                       static                record    Default__ConcreteStatic__VirtualLoosefp_Record()  {}
                       static       strictfp class     Default__ConcreteStatic__VirtualStrictfpClass     {}
                       static       strictfp interface Default__ConcreteStatic__VirtualStrictfpInterface {}
                       static       strictfp record    Default__ConcreteStatic__VirtualStrictfpRecord()  {}
                       static final          class     Default__ConcreteStatic__Final__Loosefp_Class     {}
                       static final          record    Default__ConcreteStatic__Final__Loosefp_Record()  {}
                       static final strictfp class     Default__ConcreteStatic__Final__StrictfpClass     {}
                       static final strictfp record    Default__ConcreteStatic__Final__StrictfpRecord()  {}
              abstract                       class     Default__AbstractInstanceVirtualLoosefp_Class     {}
              abstract                       interface Default__AbstractInstanceVirtualLoosefp_Interface {}
              abstract              strictfp class     Default__AbstractInstanceVirtualStrictfpClass     {}
              abstract              strictfp interface Default__AbstractInstanceVirtualStrictfpInterface {}
              abstract static                class     Default__AbstractStatic__VirtualLoosefp_Class     {}
              abstract static                interface Default__AbstractStatic__VirtualLoosefp_Interface {}
              abstract static       strictfp class     Default__AbstractStatic__VirtualStrictfpClass     {}
              abstract static       strictfp interface Default__AbstractStatic__VirtualStrictfpInterface {}
    public                                   class     Public___ConcreteInstanceVirtualLoosefp_Class     {}
    public                                   interface Public___ConcreteInstanceVirtualLoosefp_Interface {}
    public                                   record    Public___ConcreteInstanceVirtualLoosefp_Record()  {}
    public                          strictfp class     Public___ConcreteInstanceVirtualStrictfpClass     {}
    public                          strictfp interface Public___ConcreteInstanceVirtualStrictfpInterface {}
    public                          strictfp record    Public___ConcreteInstanceVirtualStrictfpRecord()  {}
    public                    final          class     Public___ConcreteInstanceFinal__Loosefp_Class     {}
    public                    final          record    Public___ConcreteInstanceFinal__Loosefp_Record()  {}
    public                    final strictfp class     Public___ConcreteInstanceFinal__StrictfpClass     {}
    public                    final strictfp record    Public___ConcreteInstanceFinal__StrictfpRecord()  {}
    public             static                class     Public___ConcreteStatic__VirtualLoosefp_Class     {}
    public             static                interface Public___ConcreteStatic__VirtualLoosefp_Interface {}
    public             static                record    Public___ConcreteStatic__VirtualLoosefp_Record()  {}
    public             static       strictfp class     Public___ConcreteStatic__VirtualStrictfpClass     {}
    public             static       strictfp interface Public___ConcreteStatic__VirtualStrictfpInterface {}
    public             static       strictfp record    Public___ConcreteStatic__VirtualStrictfpRecord()  {}
    public             static final          class     Public___ConcreteStatic__Final__Loosefp_Class     {}
    public             static final          record    Public___ConcreteStatic__Final__Loosefp_Record()  {}
    public             static final strictfp class     Public___ConcreteStatic__Final__StrictfpClass     {}
    public             static final strictfp record    Public___ConcreteStatic__Final__StrictfpRecord()  {}
    public    abstract                       class     Public___AbstractInstanceVirtualLoosefp_Class     {}
    public    abstract                       interface Public___AbstractInstanceVirtualLoosefp_Interface {}
    public    abstract              strictfp class     Public___AbstractInstanceVirtualStrictfpClass     {}
    public    abstract              strictfp interface Public___AbstractInstanceVirtualStrictfpInterface {}
    public    abstract static                class     Public___AbstractStatic__VirtualLoosefp_Class     {}
    public    abstract static                interface Public___AbstractStatic__VirtualLoosefp_Interface {}
    public    abstract static       strictfp class     Public___AbstractStatic__VirtualStrictfpClass     {}
    public    abstract static       strictfp interface Public___AbstractStatic__VirtualStrictfpInterface {}
    private                                  class     Private__ConcreteInstanceVirtualLoosefp_Class     {}
    private                                  interface Private__ConcreteInstanceVirtualLoosefp_Interface {}
    private                                  record    Private__ConcreteInstanceVirtualLoosefp_Record()  {}
    private                         strictfp class     Private__ConcreteInstanceVirtualStrictfpClass     {}
    private                         strictfp interface Private__ConcreteInstanceVirtualStrictfpInterface {}
    private                         strictfp record    Private__ConcreteInstanceVirtualStrictfpRecord()  {}
    private                   final          class     Private__ConcreteInstanceFinal__Loosefp_Class     {}
    private                   final          record    Private__ConcreteInstanceFinal__Loosefp_Record()  {}
    private                   final strictfp class     Private__ConcreteInstanceFinal__StrictfpClass     {}
    private                   final strictfp record    Private__ConcreteInstanceFinal__StrictfpRecord()  {}
    private            static                class     Private__ConcreteStatic__VirtualLoosefp_Class     {}
    private            static                interface Private__ConcreteStatic__VirtualLoosefp_Interface {}
    private            static                record    Private__ConcreteStatic__VirtualLoosefp_Record()  {}
    private            static       strictfp class     Private__ConcreteStatic__VirtualStrictfpClass     {}
    private            static       strictfp interface Private__ConcreteStatic__VirtualStrictfpInterface {}
    private            static       strictfp record    Private__ConcreteStatic__VirtualStrictfpRecord()  {}
    private            static final          class     Private__ConcreteStatic__Final__Loosefp_Class     {}
    private            static final          record    Private__ConcreteStatic__Final__Loosefp_Record()  {}
    private            static final strictfp class     Private__ConcreteStatic__Final__StrictfpClass     {}
    private            static final strictfp record    Private__ConcreteStatic__Final__StrictfpRecord()  {}
    private   abstract                       class     Private__AbstractInstanceVirtualLoosefp_Class     {}
    private   abstract                       interface Private__AbstractInstanceVirtualLoosefp_Interface {}
    private   abstract              strictfp class     Private__AbstractInstanceVirtualStrictfpClass     {}
    private   abstract              strictfp interface Private__AbstractInstanceVirtualStrictfpInterface {}
    private   abstract static                class     Private__AbstractStatic__VirtualLoosefp_Class     {}
    private   abstract static                interface Private__AbstractStatic__VirtualLoosefp_Interface {}
    private   abstract static       strictfp class     Private__AbstractStatic__VirtualStrictfpClass     {}
    private   abstract static       strictfp interface Private__AbstractStatic__VirtualStrictfpInterface {}
    protected                                class     ProtectedConcreteInstanceVirtualLoosefp_Class     {}
    protected                                interface ProtectedConcreteInstanceVirtualLoosefp_Interface {}
    protected                                record    ProtectedConcreteInstanceVirtualLoosefp_Record()  {}
    protected                       strictfp class     ProtectedConcreteInstanceVirtualStrictfpClass     {}
    protected                       strictfp interface ProtectedConcreteInstanceVirtualStrictfpInterface {}
    protected                       strictfp record    ProtectedConcreteInstanceVirtualStrictfpRecord()  {}
    protected                 final          class     ProtectedConcreteInstanceFinal__Loosefp_Class     {}
    protected                 final          record    ProtectedConcreteInstanceFinal__Loosefp_Record()  {}
    protected                 final strictfp class     ProtectedConcreteInstanceFinal__StrictfpClass     {}
    protected                 final strictfp record    ProtectedConcreteInstanceFinal__StrictfpRecord()  {}
    protected          static                class     ProtectedConcreteStatic__VirtualLoosefp_Class     {}
    protected          static                interface ProtectedConcreteStatic__VirtualLoosefp_Interface {}
    protected          static                record    ProtectedConcreteStatic__VirtualLoosefp_Record()  {}
    protected          static       strictfp class     ProtectedConcreteStatic__VirtualStrictfpClass     {}
    protected          static       strictfp interface ProtectedConcreteStatic__VirtualStrictfpInterface {}
    protected          static       strictfp record    ProtectedConcreteStatic__VirtualStrictfpRecord()  {}
    protected          static final          class     ProtectedConcreteStatic__Final__Loosefp_Class     {}
    protected          static final          record    ProtectedConcreteStatic__Final__Loosefp_Record()  {}
    protected          static final strictfp class     ProtectedConcreteStatic__Final__StrictfpClass     {}
    protected          static final strictfp record    ProtectedConcreteStatic__Final__StrictfpRecord()  {}
    protected abstract                       class     ProtectedAbstractInstanceVirtualLoosefp_Class     {}
    protected abstract                       interface ProtectedAbstractInstanceVirtualLoosefp_Interface {}
    protected abstract              strictfp class     ProtectedAbstractInstanceVirtualStrictfpClass     {}
    protected abstract              strictfp interface ProtectedAbstractInstanceVirtualStrictfpInterface {}
    protected abstract static                class     ProtectedAbstractStatic__VirtualLoosefp_Class     {}
    protected abstract static                interface ProtectedAbstractStatic__VirtualLoosefp_Interface {}
    protected abstract static       strictfp class     ProtectedAbstractStatic__VirtualStrictfpClass     {}
    protected abstract static       strictfp interface ProtectedAbstractStatic__VirtualStrictfpInterface {}
}

所以,如果算上Java14个实验性的record,或者单独计算的话,总共有112个合法的组合,32个record修饰符的合法组合,32以及 interfaces,如果你只计算 classes.

则为 48

最明显的非法组合是:

  • abstractfinalabstract表示“包含un-implemented个必须由subclasses实现的成员”和final意思是“不能被 subclassed”,很明显,需要 subclassing 但不能有 subclasses 的 class 没有意义。
  • 出于同样的原因,您不能拥有 finalinterfaceinterface 隐式完全 abstract,因为它应该是通过其实施 classes.
  • 实施
  • 并且相反,records 是隐含的 final,所以它们不能是 abstract