私有类声明[重复]
Posted
技术标签:
【中文标题】私有类声明[重复]【英文标题】:Private class declaration [duplicate] 【发布时间】:2013-01-19 12:06:59 【问题描述】:可能重复:Java: Why can we define a top level class as private?
为什么我们不能声明一个 private 外部类?如果我们可以有内部私有类,那么为什么我们不能有外部私有类...?
【问题讨论】:
那你会用那门课做什么? @OliCharlesworth 这意味着在类(包)之上的下一个访问级别,可以修改访问权限。 @stevebot:区别是公共/包,不是吗? @OliCharlesworth 是的,OP 问题的区别在于内部类处于类访问级别,而***类处于包访问级别。 【参考方案1】:私有外部类将毫无用处,因为没有任何东西可以访问它。
查看更多详情:
Java: Why can we define a top level class as private?
【讨论】:
我认为这不是真的。类之上的访问级别是一个包,在包级别定义访问修饰符是有意义的(参见package-private)。 我想知道您在私有类中添加一个主要方法并从内部访问所有其他类(公共、受保护、包私有)的情况。这样,其他类将无法实例化这个私有类,这可能是我想要的。【参考方案2】:private
修饰符将使您的课程无法从外部访问,因此不会有任何优势,我认为这就是为什么它是非法的,并且只允许使用 public
、abstract
和 final
。
注意:即使你也无法做到protected
。
【讨论】:
【参考方案3】:回答你的问题:
如果我们可以有内部私有类,那么为什么我们不能有外部 私人课...?
可以,区别在于内部类处于“类”访问级别,而“外部”类处于“包”访问级别。来自Oracle Tutorials:
如果一个类没有修饰符(默认值,也称为包私有),则它仅在其自己的包中可见(包被命名为相关类的组 - 您将在后面的课程中了解它们。)
因此,package-private(不声明修饰符)是您期望声明“外部”类私有的效果,只是语法不同。
【讨论】:
问题是为什么我们不能像private class MyClass
一样声明外部类。正如其他人所说,这是因为它没有意义。当然我们可以像这样声明它是包私有的:class MyClass
,但我认为 OP 显然在询问private class MyClass
。
@GriffeyDog 这不是因为它“没有意义”,而是因为 Java 的包私有语法不需要访问修饰符。你不需要声明private class MyClass
,因为你可以简单地声明class Myclass
但是private
,它可以被使用(如类成员声明),并不意味着包私有。这意味着没有其他类可以看到该成员。类成员可以定义为public
、protected
、default(无修饰符)、或private
,所有这些都有不同的含义。
@GriffeyDog 没错,但最大的误解是类成员与***类是完全不同的访问级别。应用于类成员的public
与应用于***类的public
也有不同的含义。【参考方案4】:
你可以。
package test;
public class Test
public static void main(String[] args)
B b = new B();
class B
// Essentially package-private - cannot be accessed anywhere else but inside the `test` package
【讨论】:
我认为这是错误的。 B 类具有默认访问器,ence 在整个测试包中都可用。 @ced - 我认为问题中没有可见性要求。只是一个私有的外部类。 它可能会给未来的读者带来误导性信息。 “只能在Test
内部访问”。这种说法在技术上并不正确
@ced 为你解决了这个问题
我在这里看不到私人课程。这里只有 Public 和 Default 类。当然这些工作。因为默认类 B 在包内的任何地方都可以访问。我不明白这将如何成为上述问题的答案。【参考方案5】:
您不能拥有private
课程,但您可以拥有second
课程:
public class App14692708
public static void main(String[] args)
PC pc = new PC();
System.out.println(pc);
class PC
@Override
public String toString()
return "I am PC instance " + super.toString();
还要记住static
内部类与单独的类没有区别,只是它的名称是OuterClass.InnerClass
。因此,如果您不想使用“闭包”,请使用静态内部类。
【讨论】:
【参考方案6】:private 使类只能被声明它的类访问。如果我们将整个类设为私有,则外部任何人都无法访问该类并使其无用。
内部类可以设为私有,因为外部类可以访问内部类,而如果将外部类设为私有,则情况并非如此。
【讨论】:
以上是关于私有类声明[重复]的主要内容,如果未能解决你的问题,请参考以下文章