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

时间:2010-08-16 06:49:36

标签: java access-modifiers

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

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作为私有和受保护时,会发生这种情况。有人可以解释一下这背后的原因吗?

谢谢!

7 个答案:

答案 0 :(得分:20)

来自Java Language specification

  

访问修饰符protected和private仅适用于直接封闭类声明中的成员类

所以是的,私有和受保护的修饰符不允许进行顶级类声明。

顶级类可能是公开的,但不允许privateprotected。如果该类声明为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不能包含两个类。