私有类声明[重复]

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 修饰符将使您的课程无法从外部访问,因此不会有任何优势,我认为这就是为什么它是非法的,并且只允许使用 publicabstractfinal

注意:即使你也无法做到protected

【讨论】:

【参考方案3】:

回答你的问题:

如果我们可以有内部私有类,那么为什么我们不能有外部 私人课...?

可以,区别在于内部类处于“类”访问级别,而“外部”类处于“包”访问级别。来自Oracle Tutorials:

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

因此,package-private(不声明修饰符)是您期望声明“外部”类私有的效果,只是语法不同。

【讨论】:

问题是为什么我们不能像private class MyClass一样声明外部类。正如其他人所说,这是因为它没有意义。当然我们可以像这样声明它是包私有的:class MyClass,但我认为 OP 显然在询问private class MyClass @GriffeyDog 这不是因为它“没有意义”,而是因为 Java 的包私有语法不需要访问修饰符。你不需要声明private class MyClass,因为你可以简单地声明class Myclass 但是private,它可以被使用(如类成员声明),并不意味着包私有。这意味着没有其他类可以看到该成员。类成员可以定义为publicprotected、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 使类只能被声明它的类访问。如果我们将整个类设为私有,则外部任何人都无法访问该类并使其无用。

内部类可以设为私有,因为外部类可以访问内部类,而如果将外部类设为私有,则情况并非如此。

【讨论】:

以上是关于私有类声明[重复]的主要内容,如果未能解决你的问题,请参考以下文章

C ++:如何声明私有成员对象[重复]

“错误C2248:'CObject :: CObject':无法访问在类'CObject'中声明的私有成员[重复]

所有私有方法上的 LNK2001 [重复]

数据隐藏和 Objective-C 合成器 [重复]

在具有 C++ 中另一个类型的类中声明属性 [重复]

私有类变量的字段与属性[重复]