【问题标题】:What does the "private package" mean? [duplicate]“私人包裹”是什么意思? [复制]
【发布时间】:2013-06-15 16:42:54
【问题描述】:

请看样例:

private package com.xm.aws;

import static com.xml.aws.PcgTest.test;

public class PackageTest {
    public static void main(String[] args) {
        test(args);
    }
}

private 告诉我关于包裹的什么信息?

【问题讨论】:

  • @fge - 它编译。所以这是合法的
  • 此处相同,无法编译(1.6 或 1.7)
  • 在我的世界里,这不是有效的 Java...(Java 1.7)
  • 在 Eclipse 中,即使这样也能正常工作 lolz:private static protected public static final package eclipse.rocks.lol; 这是 Eclipse 编译器中的一个错误
  • 上帝之母!我缺少修饰符。 private static protected public static final final final abstract volatile transient native synchronized package eclipse.rocks.lol; 我猜 Eclipse 允许包声明中的每个字段和方法修饰符。

标签: java package


【解决方案1】:

虽然包不是Java中使用private keyword实现的最高程度的封装,但它仍然是第二好的选择,并且必须封装整个功能而不仅仅是一个类。

简而言之,访问修饰符不是包声明的一部分

参考这个link

【讨论】:

  • 这是关于包本身的 private 修饰符,而不是关于类。
  • 是的,我更新了我的答案。
【解决方案2】:

写“私人包”和“包”是一样的。它们标识相同的访问级别(默认级别)。

private 修饰符指定该成员只能在其自己的包中访问(与 protected 一样)。

【讨论】:

  • 这是不正确的,因为它不是有效的 Java。
【解决方案3】:

如果你在包名前加上 private 这将是编译器错误

【讨论】:

  • 但是,它在 Eclipse 中编译。
  • @Vulcan eclipse 不是必需的 Java。我之前在 eclipse 编译器中发现了错误,因此这不是参考。参考是 Oracle JDK 或 OpenJDK。
  • @UwePlonus 我不同意这一点。我只是注意到它在 Eclipse 中编译,这就是最有可能提出问题的原因。
【解决方案4】:

我们不要将此与 package-private 或其他可以添加到类、方法和字段的访问修饰符混淆。

Java language specification 明确指出:

6.6.1。确定可访问性

  • 始终可以访问包。

看到这一点,我想到的唯一答案是,(某些)编译器不会将此视为编译时错误,而是完全没有意义。 那种方式限制类或包的可访问性是不可能的(并且每个包总是可访问的)。

java language spec的另一部分:

7.4.1。命名包

编译单元中的包声明指定名称(第 6.2 节) 编译单元所属的包。

包装声明:

注解opt package PackageName ;

所以关键字之前可以有注释。但是访问修饰符不是包声明的一部分。即使我们expand on "Annotations" 在这里也找不到访问修饰符。

另一个引用,根据JLS 18. Syntax,唯一允许在package 之前的是Annotation

编译单元:
[[注释] 包 QualifiedIdentifier ;]
{ImportDeclaration} {TypeDeclaration}

【讨论】:

  • 最后。一个答案;)
  • 有趣的是,注释可以在包级别应用——尽管我想不出一个好的用例..?
  • @GyroGearless 最后它是 Eclipse 中的一个错误。访问修饰符不是包声明的一部分,因此它们在源文件的开头有些“孤立”。他们不会在这里修改任何东西。日食需要修复。
  • 我明确同意这是一个 Eclipse 错误。我指的是您引用的 JLS 第 7.4.1 节,它允许在包级别进行注释(而不是访问修饰符)。
【解决方案5】:

您提供的代码示例在 java 中无效。 private 访问修饰符可以应用于成员和方法,包括内部类。您的代码在 Eclipse 中编译,但被 Oracle 自己的编译器拒绝。

事实上,Eclipse 为这段 java 代码生成的字节码,无论有无 private 关键字,都完全相同。这表明这可能是一个 Eclipse 错误,它在编译期间忽略了单词 package 之前的文本。

您可能已经阅读或听说过“package-private”这个短语,这意味着包之外的任何内容都无法访问该类或成员。您可以通过不对类本身使用任何访问修饰符来做到这一点。 在包上使用private关键字。

【讨论】:

    【解决方案6】:

    在我看来它只发生在日食中。当我通过命令提示符通过 javac 命令编译代码时,我得到这个编译时错误:

    错误:需要类、接口或枚举

    看这里的帖子,貌似eclipse用的是自己的jdk:

    Do I need to install java sdk if I have eclipse

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2012-12-02
      • 2019-09-12
      • 2015-01-22
      • 1970-01-01
      • 2020-10-27
      • 2015-07-15
      • 2018-07-17
      相关资源
      最近更新 更多