2010-11-10 46 views
6

我知道關於Java的一件大事就是它與平臺無關,因爲您可以創建Java應用程序並使其在Windows,Linux,Mac等中運行,只要您不需要具體到一個操作系統,並利用圖書館,只要你安裝了適當的操作系統正確解釋事物的JVM ...爲什麼Java平臺在理論和平臺上獨立於實踐?

但是,爲什麼就不能正常的計算機Java程序(如在一個簡單的Hello World在Java,例如Windows或Linux)在手機中的運行方式也是如此,當手機還安裝了特定的JVM來正確解釋事物時?

爲什麼要更改程序的結構在某些情況下,如Android開發,或使用Java ME使應用程序特定的一些普通的手機?

我知道有些功能與操作系統的某些功能有關,例如可能不適用於移動平臺,比如某些與控制檯,輸入法等相關的東西,但這是真的是使事情不兼容的唯一原因?如果是這樣的話,爲什麼只有聲明和初始化一個整型變量的簡單應用程序才能夠在所有具有JVM可用的非移動和移動平臺上運行?

我知道之前已經發布的其他問題,如this,但不關注我的目標在這裏確切點。

+5

你自己回答:有不同的環境 - 並不是所有的環境都是平等的(有些強度和/或約束力都不是很強)。即使是「線索」的想法可能也不會統一傳遞。 Android甚至不運行真正的JVM(它編譯爲它自己的格式)。 – 2010-11-10 00:20:14

回答

7

要查看的便攜性的單位是而不是應用程序。聲明並初始化一個整數變量的類將在您描述的所有平臺上以及其他許多平臺上運行。他們理解相同的字節碼,即使他們使用不同的機制(從字節碼解釋器到JIT編譯)到Android的Dalvik(將JVM字節碼轉換爲它自己的指令集)執行它。

即使我們超越單個整數變量,使用「核心」功能的Java將將在大多數這些設備上工作。 J2ME,Android和J2SE之間有很多共同之處(特別是後兩者 - J2ME被設計爲資源有限的設備的標準Java API的簡化版本,因此可用的標準API更少)。

在Windows/MAC/Linux系統中,一個應用程序通常是東西,你明確啓動,使用和 - 當你做 - 告訴它退出。將它與Android手機進行比較:應用程序可能會響應發生的事件(可能是傳入的SMS或從網絡下載的特定類型的文件)而啓動,在這種情況下它需要知道如何爲什麼它開始 - 一個簡單的public static main(String[] args)只是不削減它。一旦啓動,應用程序需要注意諸如「電池電量不足」或「進入待機模式」等事件,以釋放資源或禁用CPU密集型功能(如GPS),否則可能導致電池電量耗盡。

這些都不是那些晦澀的功能 - 它們是必不可少的一個電話是一個手機有用的 - 所以所有的原生應用程序必須處理它們。

1

Java語言是一兩件事,但隨後其他許多設備,如手機上運行他們自己的版本,這通常是一個下調的版本,以適應設備上。這些中間件還可以偶爾有其他專有類來幫助訪問硬件(即觸摸屏)。通過基於主要平臺創建單獨的平臺,您可以獲得更多的支持和更緊密的更高效的編程語言。

4

編譯Java代碼時,會生成一個獨立於系統的字節代碼(類文件)。這個字節代碼被送到駐留在系統中的JVM(Java虛擬機)。由於每個系統都有自己的JVM,因此編譯源代碼的位置並不重要。由編譯器生成的字節碼可以被任何機器的任何JVM解釋。因此它被稱爲平臺無關語言。

感謝

2

爲什麼Java平臺獨立於理論和平臺依賴性的做法?

記住並清除一件事情,即只有Java語言是平臺獨立的,並試圖理解句子的含義。 Java與平臺無關意味着您使用Java開發的代碼可以在任何機器上運行。

當您編譯.java文件時,它會生成.class文件,它包含字節碼,並且此字節碼與平臺無關,您可以在任何機器上運行它,這與Java語言的平臺無關性有關。

現在你說這不是在實踐中,所以原因是隻有Java語言是平臺獨立的,但其運行時環境(或JVM)是​​平臺相關的,它是針對每個操作系統單獨編寫的。所以我們可以說Java語言是獨立於平臺的,但其運行時環境依賴於平臺。

1

Sun微系統已經發布了不同版本的jdk。一個是基於Windows的,另一個是基於Linux/Unix的。當我們安裝jdk時,我們得到jvm,jre和javac。假設我們在安裝了windows jdk的intel處理器的windows中編寫了一個java程序,那麼該jdk的java編譯器將把.java文件轉換爲.class文件,該文件包含類似於彙編語言代碼的字節碼指令,這些字節碼指令可以只能由jvm來理解。如果我們採用在windows os中生成的.class文件,並且如果我們在linux中運行,那麼該linux機器的jvm將使用由javasoft人員開發的大約200多個指令集在內部重寫您的java程序,並將其作爲JVM。並且.class文件被執行。所以這裏要指出的是,jdk依賴於平臺,但.class不依賴於平臺,它與平臺無關,因爲jvm只負責運行任何.class文件。每個jdk的jvm內部都有預定義的指令集,即約。 200+。