单个文件中的多个类:此处不允许使用修饰符私有

2022-09-02 01:28:53

我无法理解为什么这段代码不能编译:

class A {
    public static void main(String[] args) {
        System.out.println("hi");
    }
}

private class B {
    int a;
}

我正在将内容保存在一个名为 - 的文件中,但我收到一个错误:A.java

modifier private not allowed here // where I have defined class B

当我尝试将B作为私有和受保护时,都会发生这种情况。有人可以解释一下这背后的原因吗?

谢谢!


答案 1

Java 语言规范中可以看出:

受保护的访问修饰符和私有的访问修饰符仅与直接封闭类声明中的成员类有关

因此,是的,顶级类声明不允许使用私有和受保护的修饰符。

顶级课程可以是公开的,也可以不是公开的,而不允许。如果该类被声明为 public,则可以从任何包中引用它。否则,只能从同一包(命名空间)引用它。privateprotected

私有顶级类没有多大意义,因为它不能从任何类中引用。根据定义,它将不可用。 对于成员类,使类仅引用其封闭类是可以的。private

受保护的成员类可以从 (1) 同一包的任何类和 (2) 封闭类的任何子类中引用。将此概念映射到顶级类很困难。第一种情况由没有访问修饰符的顶级类涵盖。第二种情况不适用于顶级类,因为没有封闭类或来自与此类具有特殊关系的不同包中的其他内容(如子类)。正因为如此,我认为是不允许的,因为它的基本概念不适用于顶级类。protected


答案 2

将 B 嵌套为 A,如下所示:

class A {
    public static void main(String[] args) {
        System.out.println("hi");
    }

    private class B {
        int a;
    }
}

或者将 B 移动到单独的文件。您也可以坚持使用默认访问级别,这样只能从包中访问该类:

class A {
    public static void main(String[] args) {
        System.out.println("hi");
    } 
}

class B {
    int a;
}

推荐