Java:为什么我们可以将顶级类定义为私有?

时间:2009-12-16 10:52:04

标签: java

为什么Java允许将顶级类声明为私有?除了“我们无法访问私人课程”之外还有其他原因吗?

11 个答案:

答案 0 :(得分:68)

嗯,你不能。作为私有的顶级类将完全没用,因为没有东西可以访问它。

答案 1 :(得分:25)

Java不允许顶级类是私有的。只有'公开'或'包'。

答案 2 :(得分:10)

我相信一个更好的问题是:

  

顶级课程是私有的意味着什么?

如果您考虑访问级别,则上面的级别是包。实际上,您可以在Java中使用包私有顶级类!取自Oracle (formerly Sun) Java tutorials

  

如果一个类没有修饰符(默认值,也称为包私有),它只在其自己的包中可见(包是相关类的命名组 - 您将在后面的课程中了解它们。)< / p>

根据我提出的问题的答案,这可能符合您对“顶级私人课程”的定义。

答案 3 :(得分:7)

理论上,您可以在private顶级类上实例化和调用方法(如果语言允许这样的事情...... 它不是!) ,但你必须使用反射来做到这一点。理智地(IMO)Sun决定私人顶级课程在语言水平上不是一件好事。

实际上,JVM 可能支持由字节码魔术创建的顶级私有“类”。但这不是一件有用的事情。


UPDATE - 实际上,current JVM spec清楚地表明类的访问标志字的ACC_PRIVATE位是“保留供将来使用”,并且Java实现应该对待它没有设置。因此,对于任何严格执行当前规范的JVM,上述推测都没有实际意义。

答案 4 :(得分:5)

允许私有类,但仅作为内部类或嵌套类。如果您有私有内部类或嵌套类,则访问仅限于该外部类的范围。

如果你有一个私人课程作为顶级课程,那么你就无法从任何地方访问它。所以拥有顶级私人课程是没有意义的。

答案 5 :(得分:4)

我们不能将外部类声明为私有。更确切地说,我们不能将私有访问说明符与外部类一起使用。一旦您尝试将私有访问说明符与类一起使用,您将在Eclipse中收到一条错误消息,即只有public,final,abstract可以用作类的访问修饰符。

将类设为私有没有任何意义,因为我们无法在外部访问其类的代码。

答案 6 :(得分:2)

无法访问该类或其成员。

答案 7 :(得分:1)

这需要简单理解为什么不需要在Java中将类声明为私有。 如果您的类本身是一个独立的程序/软件(这是不太可能),那么您已经在项目和特定于它的包中定义了它。因此添加私有关键字对它来说是多余的。 如果不是这种情况,那么默认访问就意味着您的程序/软件依赖于要运行的不同类。如果我们将其中的一个类声明为私有(如果可能的话),那么我们将其可访问性限制为其他类等,这是没有用的。它只是意味着我们声明为私有的类对于运行代码没有用处。这再次使它无用。 如果您的意思是包级别访问,那么对于默认访问,我们不需要在它之前声明任何关键字。

答案 8 :(得分:1)

private访问修饰符是限制性最强的访问修饰符。 使用private访问修饰符定义的类的成员只能由自己访问。无论所讨论的类或接口是来自另一个包还是扩展了类private成员都无法在其中的类之外访问 他们被定义了。私有成员只能访问定义它们的类和接口。那么,当private外类无法用于任何事物时,它的用途是什么。显然,它不能用作起跑班吗?有关Java Access Modifiers的更多类似细节,请参见下图。

Java Access Modifiers

答案 9 :(得分:1)

我们已经知道使用私有关键字在类中定义的字段只能在同一类中访问,而外部世界则看不到。

那么,如果我们定义一个私有类,那该怎么办呢?该类只能在定义它的实体(在我们的情况下是它的包)中访问?

让我们考虑下面的A类示例

package com.example;
class A {
    private int a = 10;

    // We can access a private field by creating object of same class inside the same class
    // But realy no body creates object of a class inside the same class
    public void usePrivateField(){
        A objA =  new A();
        System.out.println(objA.a);
    }
}

字段“ a”在“ A”类中被声明为私有,因此,“ a”字段对于“ A”类变为私有,并且只能在“ A”中访问。现在,假设我们被允许将类“ A”声明为私有,因此在这种情况下,类“ A”将对包com.example变为私有,并且无法从包外部访问。

因此,定义对类的私有访问将使它可以在默认关键字已经为我们使用的同一个程序包中访问,因此,将类定义为私有将没有任何好处,只会使事情变得模棱两可。

您可以阅读我的文章Why an outer Java class can’t be private or protected的更多信息。

答案 10 :(得分:0)

您无法定义顶级类私有(或除公共之外的任何其他内容)。您将收到编译错误。

Something.java:6: error: modifier private not allowed here
private class Something {
        ^
1 error

您只有两个选项,公开或根本没有访问修饰符。通过省略public,隐式地限制对包内的类访问(aka:package-private)。