Java “是什么意思?”;“包装的可观察性”;在JLS第7章中
我正在学习Java语言规范,对于Java “是什么意思?”;“包装的可观察性”;在JLS第7章中,java,jls,Java,Jls,我正在学习Java语言规范,对于“包的可观察性”的含义,我有一个问题: 当且仅当以下情况之一时,包才可见: 包含包声明的编译单元是可观察的(§7.3) 包的子包是可见的 我的问题是 如何理解包装的可观察性 如何理解第二个条件包的子包是可观察的 JLS中有四个概念可以精确描述: 1) 编译单元是可观察的 2) 编译单元总是可见的 3) 包裹是可见的 4) 包裹总是可见的 1) 让我们假设编译单元“A”是可观察的。 这意味着Java编译器可以找到这个编译单元并解析/编译它的内容 2) 如果任何独
“包的可观察性”
的含义,我有一个问题:
当且仅当以下情况之一时,包才可见:
- 包含包声明的编译单元是可观察的(§7.3)
- 包的子包是可见的李>
包的子包是可观察的
JLS中有四个概念可以精确描述: 1) 编译单元是可观察的 2) 编译单元总是可见的 3) 包裹是可见的 4) 包裹总是可见的 1) 让我们假设编译单元“A”是可观察的。 这意味着Java编译器可以找到这个编译单元并解析/编译它的内容 2) 如果任何独立于其属性的编译过程都可以找到并解析/编译此编译单元,则编译单元始终是可观察的。 通常,Java实现者提供始终可见的编译单元 3) 当且仅当包中至少存在一个可观察的编译单元时,包才是可观察的 或者至少存在一个可观察的子包。 我还想指出,包仍然可以包含不可见的编译单元或子包 4) 当且仅当包中至少存在一个始终可见的编译单元时,包才始终可见 或者至少存在一个子包,该子包总是可见的。 通常,总是可见的子包是由Java实现者提供的。
我还想指出的是,包仍然可以包含不可见的编译单元或子包。这是我之前回答的继续
我们考虑Oracle、
中有关“java SE 8”的实现的四个概念。 首先,编译单元是简单文件,包是本地文件系统的文件夹 1) 我们如何使特定的编译单元在特定的遵从性中可见? 为此,我们使用Java编译器javac并枚举编译初始化,将它们用空格分隔 例如,如果当前文件夹是D:\Foo1\Foo2,我们将 javac com\myclass1\myclass1.java com\myclass2\myclass2.java 我们编译了两个编译初始化: D:\Foo1\Foo2\com\myclass1\myclass1.java D:\Foo1\Foo2\com\myclass2\myclass2.java 此外,我们还可以使用以下选项修改编译: 1) javac编译器的“-sourcepath”选项。 2) javac编译器的“-classpath”或“-cp”选项。 3) “CLASSPATH”环境变量 看 更多细节 我还想指出的是“-sourcepath”只搜索编译单元,而“-classpath”(或-cp”和“classpath”)不仅可以搜索编译单元,还可以搜索编译后的Java类(*.class文件),这些类可以选择性地捆绑在jar/zip文件中。 这些已编译的类现在不是编译单元,但在编译之前是编译单元。 我们可以将它们视为“修改的”编译单元或编译单元,在此之前进行了一些处理。 因此,通过上述三个选项,我们可以向特定编译添加更多编译单元 2) 始终可见的编译单元与“Java SE 8”的安装捆绑在一起,位于“…\jdk1.8.0_51\jre\lib”中。 它们中的大多数都放在众所周知的“rt.jar”中,但放在其他jar中的编译单元也总是可见的。 正如您所看到的,它们被绑定为位于jar文件中的编译类文件,因此它们是“修改的”编译单元 3) 如果您查看“…\jdk1.8.0_51\jre\lib”,您将发现许多始终可见的包: java-根据规范始终可见 java.lang-根据规范始终可见 java.io-根据规范始终可见 java.applet java.awt java.bean java.math java.net java.nio java.rmi java.security java.sql java.text java.time java.util您也可以将自己的lib放在“…\jdk1.8.0\u 51\jre\lib\ext”中,以确保lib始终可见。我以前已经读过这个主题,但它无法说服我,主题是“2001-3-8 10:23pm”。