2010-11-10 48 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+。