我无法理解为什么这段代码无法编译:
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作为私有和受保护时,会发生这种情况。有人可以解释一下这背后的原因吗?
谢谢!
答案 0 :(得分:20)
来自Java Language specification:
访问修饰符protected和private仅适用于直接封闭类声明中的成员类
所以是的,私有和受保护的修饰符不允许进行顶级类声明。
顶级类可能是公开的,但不允许private
和protected
。如果该类声明为public,则可以从任何包中引用它。否则,它只能从同一个包(名称空间)引用。
私有顶级类没有多大意义,因为它无法从任何类引用。根据定义,它将无法使用。对于成员类来说,private
可以使一个类仅适用于它的封闭类。
受保护的成员类可以从(1)同一个包的任何类和(2)封闭类的任何子类中引用。将此概念映射到顶级类很难。第一种情况由顶级类覆盖,没有访问修饰符。第二种情况不适用于顶级类,因为没有封闭类或来自不同包的其他东西与该类有特殊关系(如子类)。因此,我认为protected
是不允许的,因为它的基础概念不适用于顶级类。
答案 1 :(得分:3)
使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;
}
答案 2 :(得分:1)
private和protected对于允许进入顶级(非成员)类/接口毫无意义。
它们仅适用于可以是变量,常量,构造函数,方法,类和接口的类成员。
<强>为什么:强>
(1) private:如果我们将一个类定义为私有,可能是什么意思/目的。它的范围应该是某些地区的私人。默认访问已经是包私有。并且没有人希望类是私有的源文件(猜测原因)它可能不是一个好的编程习惯,因为Java应用程序最终以包的形式组织,但不是源文件。任何源文件都应该是某个包的一部分,因此在广泛/最终视图中,每个类/接口都是某个包的一部分,而不仅仅是某个.java文件的一部分。所以不适用。
(2)受保护:如果某些内容受到保护,它应仅在包内可用,并且只能在其他包中的子类中使用。要在不同的包中扩展一个类,它应该可用于其他包中的所有类,但是protected表示类应仅对扩展它的类可用。这是一种僵局。所以不适用。
资料来源:我的阅读和理解
答案 3 :(得分:0)
根本没有私人/受保护的修饰符。
答案 4 :(得分:0)
B需要对某些东西保密。将它放在A类的定义中或创建另一个文件B.java,并在那里定义它,但它不能是私有的。
答案 5 :(得分:-1)
如果您不对该类使用public关键字,则默认情况下它将是私有的(仅在文件中可见)。
每个.java文件只能有一个公共类,其他所有文件都需要是私有的。因此,A类可以是公共的,B类在您的示例中不需要任何修饰符。公共类名称必须与.java文件名匹配(例如,A.java只能包含一个名为“A”的公共类)。
答案 6 :(得分:-2)
A.java
不能包含两个类。