2014-04-12 30 views
2

我學習Java語言規範,「一包的可觀測性」意義,我在JLS §7.4.3 - Observability of a Package關於"Observability of a Package"含義的問題:什麼是第7章JLS

包是可觀察的,如果和僅在以下情況下:

  • 包含該包的聲明的編譯單元是可觀察的(第7.3節)。
  • 包的一個子包是可觀察的。

我的問題是

  1. 如何理解包
  2. 如何理解第二個條件的可觀測A subpackage of the package is observable
+0

http://www.coderanch.com/t/198137/java-programmer-SCJP/certification/Observable-packages – stinepike

+0

我以前已經閱讀過這個話題,但它無法說服我,而且話題已貼出「2001-3-8 10:23 pm」。 – Alex

回答

1

有在JLS四個概念,它是精確到:

1)A編譯單元是可觀察 2)編譯單元總是可觀察到的 3)A包裝是可觀察到的 4)A包裝是可觀察到的總

1)讓我們假設編譯單元「A」是可觀察的。 這意味着Java編譯器可以以某種方式找到這個編譯單元並解析/編譯它的內容。

2)如果獨立於其屬性的編譯過程可以找到並解析/編譯此編譯單元,則編譯單元總是可觀察的。通常可觀察的編譯單元由Java實現者提供。

3)一個包是可觀察的,當且僅當存在該包的至少一個可觀察的編譯單元 或者存在至少一個可觀察的子包。 另外我想指出的是,軟件包仍然可以包含不可觀察的編譯單元或子包。

4)只要存在至少一個總是可觀察到的此包的編譯單元,或者至少存在一個始終可觀察的子包,則該包總是可觀察的。 通常,可觀察的子包由Java實現者提供。 另外我想指出的是,軟件包仍然可以包含不可觀察的編譯單元或子包。

0

這是我以前的答案的延續。

讓我們考慮一下上述四個概念是如何與Oracle實現「Java SE 8」相關的。

首先編譯單元是簡單文件,包是本地文件系統的文件夾。

1)我們如何編制特定的編譯單元在特定的編譯中是可觀察的? 爲此,我們使用Java Compiler javac並枚舉Compilation Inits將它們與空格分開。

例如,如果當前文件夾是d:\ Foo1 \ foo2的,我們寫

javac的COM \ MyClass1的\ MyClass1.java COM \ myclass2 \ MyClass2.java

我們編譯兩個編譯inits: d:\ Foo1 \ foo2的\ COM \ MyClass1的\ MyClass1.java d:\ Foo1 \ foo2的\ COM \ myclass2 \ MyClass2.java

此外,我們可以修改我們的編輯使用下列選項: 1)「-sourcepath 「選項的javac編譯器。 2)javac編譯器的「-classpath」或「-cp」選項。 3)「CLASSPATH」環境變量。

請參閱http://docs.oracle.com/javase/8/docs/technotes/tools/windows/javac.html 瞭解更多詳情。另外我想說明的是「-sourcepath」只搜索編譯單元,但「-classpath」(或-cp「和」CLASSPATH「)不僅可以搜索編譯單元,還可以搜索編譯Java類(* .class文件),它們可以被捆綁在jar/zip文件中 這個編譯的類現在不是編譯單元,但它們是編譯之前的編譯單元 我們可以將它們視爲「修改過的」編譯單元或編譯單元, 因此,通過以上三個選項,我們可以在我們的特定彙編中添加更多編譯單元。

2)Always Observable編譯單元與i安裝「Java SE 8」並位於「... \ jdk1.8.0_51 \ jre \ lib」中。他們中的大多數被放置在衆所周知的「rt.jar」中。但放置在其他罐子裏的編輯單元也總是可觀察的。 正如你所看到的,它們被捆綁爲位於jar文件中的編譯類文件,因此它們是「修改」的編譯單元。

3)如果你通過看 「... \ jdk1.8.0_51 \ jre的\ LIB」,你會發現相當多的總是觀察到的包:

爪哇 - 根據規範總是觀察到

的java .lang - 始終觀察的依據規範

java.io - 根據規範

的java.applet

的Java總是觀察到.awt

java.beans中

的java.math

java.net

java.nio中

java.rmi中

java.security

的java。 sql

的java.text

java.time

的Java。UTIL

.........

你也可以將自己的庫到 「... \ jdk1.8.0_51 \ JRE \ lib中\分機」 爲了你的庫總是觀察到。