“私有包”是什么意思?

27
请看示例:
private package com.xm.aws;

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

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

private关键字对于这个包告诉我什么?


2
@fge - 它编译通过了。所以它是合法的。 - Andreas Dolk
4
我也是一样的,无法编译(1.6或1.7版本)。 - fge
3
在我的宇宙中,这不是有效的Java...(Java 1.7) - Gyro Gearless
16
在Eclipse中,即使这样也可以工作啦:private static protected public static final package eclipse.rocks.lol; 这是Eclipse编译器的一个漏洞。 - c.P.u1
7
天啊!我缺少修饰符了。private static protected public static final final final abstract volatile transient native synchronized package eclipse.rocks.lol; 我猜Eclipse允许在包声明中使用所有字段和方法修饰符。 - c.P.u1
显示剩余20条评论
6个回答

24

请不要将其与可添加到类、方法和字段的其他访问修饰符以及“包私有”混淆。

Java语言规范明确指出:

6.6.1. 确定可访问性

  • 包始终是可访问的。

从中可以看出,我想到的唯一答案是:(某些)编译器不会将其视为编译时错误,但这完全没有意义。不可能以那种方式限制对类或包的可访问性(并且每个包始终是可访问的)。

来自Java语言规范的另一节内容:

7.4.1. 命名包

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

PackageDeclaration:

Annotationsopt package PackageName ;

因此,关键字可能会在注释之前。但访问修饰符不是包声明的一部分。即使我们扩展“Annotations”,也找不到这里的访问修饰符。

根据JLS 18. Syntax的另一个参考,允许在package之前只有一个Annotation

CompilationUnit:
[[注解] 包限定标识符 ;]
{引入声明} {类型声明}


1
终于有答案了 ;) - Maroun
2
@GyroGearless 最终这是Eclipse的一个bug。访问修饰符不属于包声明的一部分,因此它们在源文件开头有些“孤立”。它们在这里不会修改任何内容。需要修复Eclipse。 - Andreas Dolk
我明确同意这是一个 Eclipse 的 bug。我所提到的是你引用的 JLS 7.4.1 节,它允许在包级别使用注解(而不是访问修饰符)。 - Gyro Gearless
3
https://dev59.com/HXI95IYBdhLWcg3w5iY4 - Tim Bender
我认为这不是Eclipse的错误。答案显示根据Java语言规范是允许的,因此是有效的。它在Java中根本不起作用,并且正如Tim Bender指定的SO问题所述,用于其他事情。 - ADTC
显示剩余6条评论

6
您提供的代码示例在Java中无效。访问修饰符private可以应用于成员和方法,包括内部类。您的代码可以在Eclipse中编译,但被Oracle自己的编译器拒绝。
事实上,Eclipse为此Java代码生成的字节码,无论是否使用private关键字,都是完全相同的。这表明这可能是Eclipse的一个错误,在编译过程中忽略了单词package之前的文本。
您可能读到或听到的是短语“包私有”,这意味着包外部无法访问该类或成员。您可以通过不在类本身上使用任何访问修饰符来实现这一点,而不是在包上使用private关键字。

2
尽管在 Java 中,使用 private 关键字 实现的封装是最高程度的封装,但包仍然是次佳选项,并且必须封装整个功能而不仅仅是一个类。
简而言之,访问修饰符不是包声明的一部分
请参考此链接

1
这是关于包本身的private修饰符,而不是类。 - Gabriel Negut

2
如果在包名前添加private关键词,这将会导致编译器报错。

然而,在Eclipse中它可以编译。 - FThompson
3
@Vulcan Eclipse并不是必须使用Java的。我之前曾在Eclipse编译器中发现错误,因此它并不能作为参考。参考应该是Oracle JDK或OpenJDK。 - Uwe Plonus
2
@UwePlonus 我并不反对这个观点。我只是注意到它可以在 Eclipse 中编译,这也是这个问题最初被提出的原因。 - FThompson

1

在我看来,这只发生在eclipse中。当我通过命令提示符使用javac命令编译代码时,我会收到此编译时错误:

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

从这里的帖子来看,似乎eclipse使用自己的jdk:

如果我有eclipse,是否需要安装java sdk


-1

编程相关内容:写“private package”和“package”是一样的。它们标识相同的访问级别(默认级别)。

私有修饰符指定该成员只能在其自己的包内访问(与受保护的访问级别相同)。


1
这是不正确的,因为它不是有效的Java代码。 - Uwe Plonus

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接