Java:为什么我们可以将顶级类定义为私有类?
Java为什么允许将顶级类声明为私有? 除了“我们无法访问私人课程”之外,还有其他原因吗?
Satya asked 2020-07-02T20:59:13Z
11个解决方案
68 votes
好吧,你不能。 顶级类作为私有类是完全没有用的,因为没有人可以访问它。
Maximilian Mayerl answered 2020-07-02T20:59:22Z
25 votes
Java不允许顶级类是私有的。 仅“公共”或“包”。
Guillaume answered 2020-07-02T20:59:41Z
10 votes
我相信一个更好的问题是:
顶级班级是私人的意味着什么?
如果您考虑访问级别,那么该类之上的级别是包。 实际上,您可以使用Java打包私有顶级类! 从Oracle(以前的Sun)Java教程中获取:
如果一个类没有修饰符(默认值,也称为package-private),则它仅在其自己的包中可见(包被命名为相关类的组,您将在以后的课程中对其进行了解。)
根据我提出的问题的答案,这可能符合您对“顶级私人课程”的定义。
stevebot answered 2020-07-02T21:00:19Z
8 votes
从理论上讲,您可以在private顶级类上实例化并调用方法(如果语言允许这样做的话……不是!),但是您必须使用反射来做到这一点。 明智地(IMO)Sun认为,在语言级别上支持私人顶级课程不是一件好事。
实际上,JVM可能支持由字节码魔术创建的顶级私有“类”。 但这不是一件有用的事情。
更新-实际上,当前的JVM规范清楚地表明,类的访问标志字的ACC_PRIVATE位“保留供将来使用”,并且Java实现应将其视为未设置。 因此,对于任何严格实现当前规范的JVM来说,上述猜测都是没有根据的。
Stephen C answered 2020-07-02T21:00:49Z
5 votes
私有类是允许的,但只能作为内部或嵌套类。如果您有私有内部或嵌套类,则访问仅限于该外部类的范围。
如果您自己拥有一个私有类作为顶级类,那么您将无法从任何地方访问它,因此拥有顶级私有类是没有意义的。
Aniket Thakur answered 2020-07-02T21:01:14Z
4 votes
我们不能将外部类声明为私有类。 更确切地说,我们不能将私有访问说明符与外部类一起使用。 尝试将私有访问说明符与类一起使用时,您将在Eclipse中收到一条消息,提示错误:仅公共,最终,抽象可用作类的访问修饰符。
将类设为私有没有任何意义,因为我们无法在外部访问该类的代码。
Rajnish answered 2020-07-02T21:01:39Z
2 votes
将无法访问该类或其成员。
Ranger answered 2020-07-02T21:01:59Z
2 votes
private访问修饰符是限制性最强的访问修饰符。使用private访问修饰符定义的类的成员只能自己访问。 所讨论的类或接口是来自另一个包还是已扩展该类,都无所谓private成员在该类之外无法访问它们是定义的。 私有成员只能访问定义它们的类和接口。 那么当private外层类不能用于任何东西时,它的用途是什么。 显然,它不能用作入门课程吗? 有关Java访问修饰符的更多类似详细信息,请参见下图。
Menuka Ishan answered 2020-07-02T21:02:20Z
1 votes
这需要简单理解为什么在Java中不需要将类声明为私有。如果您的类本身是一个独立的程序/软件(极不可能),那么您已经在项目中定义了它,并且已在特定于它的包中对其进行了定义。 因此,添加private关键字是多余的。如果不是这种情况,那么将使用默认访问权限,这意味着您的程序/软件依赖于不同的类来运行。 如果我们将其中一个类声明为私有(如果可以的话),那么我们将其限制为其他类等的访问性,这是没有用的。 这只是意味着我们声明为私有的类对于运行代码没有用处。 再次使它无用。如果您指的是包级别访问权限,那么对于默认访问权限,我们不需要在其之前声明任何关键字。
Nikhil Arora answered 2020-07-02T21:02:41Z
1 votes
我们已经知道,使用private关键字在类中定义的字段只能在同一类中访问,而外界看不到。
那么,如果我们将定义一个私有类,该类将只能在定义了它的包(在我们的情况下是它的包)内的实体内访问,将会发生什么?
让我们考虑下面的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”变为私有,并且无法从包外部访问。
因此,定义对类的私有访问将使它可以在默认关键字已经为我们完成的同一个程序包中进行访问,因此,将类定义为私有不会带来任何好处,只会使事情变得模棱两可。
您可以在我的文章《为什么外部Java类不能私有或受保护》中阅读更多内容。
Naresh Joshi answered 2020-07-02T21:03:24Z
0 votes
您不能定义顶级私有类(或公共类之外的任何其他类)。 您将得到一个编译错误。
Something.java:6: error: modifier private not allowed here
private class Something {
^
1 error
您只有两个选项,公共访问权限或根本没有访问修饰符。 通过省略public,可以隐式地限制类对包的访问(aka:package-private)。
Timothy Perez answered 2020-07-02T21:03:48Z