Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/394.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 为什么可以';我们不能将顶级类定义为private吗?_Java - Fatal编程技术网

Java 为什么可以';我们不能将顶级类定义为private吗?

Java 为什么可以';我们不能将顶级类定义为private吗?,java,Java,为什么Java不允许将顶级类声明为私有类?除了“我们不能访问私有类”之外,还有其他原因吗?作为私有的顶级类是完全无用的,因为没有任何东西可以访问它。Java不允许顶级类是私有的。只有“public”或“package”。从理论上讲,您可以实例化和调用private顶级类上的方法(如果语言允许这样的事情……但实际上不允许!),但您必须使用反射来实现这一点。明智地(IMO)Sun认为在语言级别支持私有顶级类不是一件好事 实际上,JVM可能支持字节码魔术创建的顶级私有“类”。但这不是一件有用的事情

为什么Java不允许将顶级类声明为私有类?除了“我们不能访问私有类”之外,还有其他原因吗?

作为私有的顶级类是完全无用的,因为没有任何东西可以访问它。

Java不允许顶级类是私有的。只有“public”或“package”。

从理论上讲,您可以实例化和调用
private
顶级类上的方法(如果语言允许这样的事情……但实际上不允许!),但您必须使用反射来实现这一点。明智地(IMO)Sun认为在语言级别支持私有顶级类不是一件好事

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



更新-事实上,说明类的访问标志字的ACC_私有位是“保留供将来使用的”,Java实现应该将其视为未设置。因此,对于严格实现当前规范的任何JVM来说,上述推测都是没有意义的。

将无法访问该类或其成员。

我认为更好的问题是:

对于顶级课程来说,私人化意味着什么

如果您从访问级别的角度考虑,则类之上的级别是package。事实上,您可以在Java中使用包私有顶级类!摘自:

如果类没有修饰符(默认值,也称为包专用),则它仅在其自己的包中可见(包是相关类的命名组-您将在后面的课程中了解它们)


根据我所问问题的答案,这可能符合您对“顶级私有类”的定义。

私有类是允许的,但只能作为内部类或嵌套类。如果您有一个私有的内部类或嵌套类,那么访问将限制在该外部类的范围内


如果您有一个作为顶级类的私有类,那么您无法从任何地方访问它。因此,拥有顶级私有类是没有意义的。

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


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

您不能定义顶级类私有(或除公共之外的任何其他内容)。您将得到一个编译错误

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

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

这需要简单理解为什么在Java中不需要将类声明为private

如果您的类本身是一个独立的程序/软件(这是不太可能的),那么您应该已经在一个项目和一个特定于它的包中定义了它。因此,添加
private
关键字是多余的

如果不是这样,则默认访问权限为,这意味着您的程序/软件依赖于不同的类来运行。如果我们将其中的一个类声明为private(如果可以的话),那么我们就限制了其他类对它的访问,等等,这是没有任何用处的。这仅仅意味着我们声明为private的类对于代码的运行没有任何用处。这又让它变得毫无用处


如果您指的是包级访问,那么对于默认访问,我们不需要在其前面声明任何关键字。

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

那么,如果我们定义一个私有类,会发生什么呢?该类是否只能在定义它的实体中访问,在我们的例子中,该实体是它的包

让我们考虑下面的A类< /P>示例

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 really nobody creates an 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”的私有,并且不能从包外部访问

因此,定义对类的私有访问将使它可以在
default
关键字已经为我们提供的相同包中访问。因此,定义私有类没有任何好处;这只会使事情变得模棱两可


您可以在我的文章中阅读更多内容。

您的意思是我们不能将顶级课程定义为(2020-04-16)的私人科目。不一定正确。类之上的访问级别是一个包。该类只能作用于包,拒绝访问其他包。@stevebot我猜这被称为
Protected
@MuhammadBabar实际上,
Protected
不是类的合法修饰符。为了使一个类仅被“限定”到其包,您只需不指定任何修饰符(与
Public
相反)@stevebot类既不能是私有的,也不能是受保护的。同样的包类不能访问私有方法和变量。