我知道Java的一大优点是它与平台无关,因为你可以创建一个Java应用程序并让它在Windows,Linux,Mac等运行,只要你不要使用特定于一个操作系统的库,只要您为相应的操作系统安装了JVM以正确解释事物......
然而,为什么普通的计算机Java程序(例如在Java中的简单Hello World,例如Windows或Linux)在手机中运行时也是如此,当时手机也安装了特定的JVM正确地解释事情?
为什么有必要在某些情况下更改程序的体系结构,例如Android开发,或者使用Java ME来创建特定于某些普通手机的应用程序?
我知道有些功能与操作系统的某些功能相关,例如可能不适用于移动平台,例如与控制台,输入方法等相关的一些功能,但这是真的使东西不兼容的唯一原因?如果是这样,为什么一个只是声明和初始化整数变量的简单应用程序不能在所有具有JVM的非移动和移动平台上运行?
我知道之前发布过的其他问题,例如this,但是我没有关注我的目标。
答案 0 :(得分:8)
要查看的可移植性单元是类而不是应用程序。声明并初始化整数变量的类将在您描述的所有平台上运行,还有许多其他平台。他们理解相同的字节码,即使他们使用不同的机制执行它,从字节码解释器到JIT编译,再到Android的Dalvik(将JVM字节码转换成自己的指令集)。
即使我们超越单个整数变量,使用“核心”功能的Java 也可以在大多数这些设备上运行。 J2ME,Android和J2SE之间存在很多共同点(尤其是后两者--J2ME旨在作为资源有限的设备的标准Java API的简化版本,因此可用的标准API较少)。
在Windows / Mac / Linux系统上,应用程序通常是您明确启动,使用的,并且 - 当您完成后 - 告诉它退出。比较一下Android手机:应用程序可能是为了响应发生的事件而启动的(可能是传入的SMS,或从Web下载的特定类型的文件),在这种情况下,它需要知道如何< / em>和为什么它已经启动 - 一个简单的public static main(String[] args)
只是没有削减它。一旦启动,应用程序需要了解“电池电量不足”或“进入待机模式”等事件,以释放资源或禁用可能会耗尽电池的CPU密集型功能(如GPS)。
这些不是模糊的功能 - 它们对于手机作为手机非常重要 - 所以所有原生应用都必须处理它们。
答案 1 :(得分:4)
编译Java代码时,会生成一个独立于系统的字节代码(类文件)。此字节代码被提供给驻留在系统中的JVM(Java虚拟机)。由于每个系统都有自己的JVM,因此编译源代码的位置无关紧要。编译器生成的字节代码可以由任何机器的任何JVM解释。因此,它被称为平台独立语言。
感谢
答案 2 :(得分:2)
为什么Java平台在理论和平台上独立于实践中?
记住并清除只有Java语言与平台无关的一件事,并尝试理解句子的含义。 Java独立于平台意味着您使用Java开发的代码可以在任何机器上运行。
当你编译.java
文件时,它生成.class
文件,它包含字节码,这个字节码是独立于平台的,你可以在任何机器上运行它,这就是Java语言的平台独立性。
现在你说它不在实践中,原因只是Java语言与平台无关,但它的运行时环境(或JVM)是依赖于平台的,它是为每个操作系统单独编写的。所以我们可以说Java语言是独立于平台的,但它的运行时环境依赖于平台。
答案 3 :(得分:1)
java语言只是一件事,但随后许多其他设备(如手机)都运行自己的版本,这通常是一个缩小版本以适应设备。也可以偶尔使用其他专有类来帮助访问硬件(即触摸屏)。通过制作基于主要平台的独立平台,您可以获得更多支持和更高效的编程语言。
答案 4 :(得分: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 +。