为什么Java在理论上是平台无关的,但在实践中却是平台相关的?

9
我知道Java的一个重要特点是它具有跨平台性,这意味着只要你不使用特定于某个操作系统的库,并且为适当的操作系统安装了JVM以正确解释事物,你就可以制作一个Java应用程序并在Windows、Linux、Mac等平台上运行。但是,为什么一般的计算机Java程序(例如在Windows或Linux上的简单Hello World)不能在手机上运行,而手机也安装了特定的JVM以正确解释事物?为什么有时需要改变程序的架构,例如Android开发,或者使用Java ME制作特定于某些普通手机的应用程序?我知道有些功能与操作系统的某些功能相关,例如一些与控制台、输入方法等相关的事物,在移动平台上可能不适用,但这真的是使事物不兼容的唯一原因吗?如果是这样,那么为什么一个只声明和初始化整数变量的简单应用程序不能在所有具有可用JVM的非移动和移动平台上运行呢?我知道之前有其他问题发布过,例如这个,但那并不是我在这里关注的确切问题。

5
你自己已经回答了:有不同的环境——并非所有的环境都是平等的(有些要受到很大限制)。甚至“线程”的概念可能并不能完全适用于所有情况。Android甚至没有真正运行JVM(它会被编译成自己的格式)。 - user166390
5个回答

8
要看可移植性的单位是一个class而不是一个application。声明和初始化整数变量的class将在您描述的所有平台上运行,以及许多其他平台。即使它们使用不同的机制来执行相同的字节码,范围从字节码解释器到JIT编译,再到Android的Dalvik(将JVM字节码转换为自己的指令集),它们也能理解相同的字节码。
即使我们超越单个整数变量,使用“核心”功能的Java也将在大多数设备上工作。 J2ME,Android和J2SE之间有很多共同点(特别是后两者-J2ME旨在成为标准Java API的精简版本,供资源有限的设备使用,因此提供的标准API较少)。
在Windows / Mac / Linux系统上,应用程序通常是您明确启动,使用并告诉其退出的东西。与之相比,例如Android手机:应用程序可能会响应事件而启动(例如收到短信或从Web下载特定类型的文件),在这种情况下,它需要知道如何以及为什么被启动-简单的public static main(String [] args)就不够了。一旦启动,应用程序需要注意诸如“低电量”或“进入待机模式”之类的事件,以释放资源或禁用可能耗尽电池的CPU密集型功能(例如GPS)。
这些不是晦涩的功能-它们对于手机有用是必不可少的-因此,所有本机应用程序都必须处理它们。

5
当Java代码被编译时,会生成一个独立于系统的字节码(class文件)。这个字节码被提供给存在于系统中的JVM(Java虚拟机)。由于每个系统都有自己的JVM,因此在哪里编译源代码并不重要。编译器生成的字节码可以由任何机器上的任何JVM解释执行。因此,它被称为平台无关语言。
谢谢。

2
理论上,为什么Java是跨平台的,但在实际应用中却依赖于特定平台呢?
要记住并清楚一件事:只有Java语言是跨平台的,需要理解这句话的含义。Java是跨平台的意思是你使用Java开发的代码可以在任何机器上运行。
当你编译.java文件时,它会生成.class文件,其中包含字节码,而这个字节码是跨平台的,您可以在任何机器上运行它,这就是Java语言的跨平台性。
现在你说它在实践中不是这样,原因是只有Java语言是跨平台的,但其运行环境或JVM是平台相关的,需要针对每个操作系统单独编写,所以我们可以说Java语言是跨平台的,但其运行环境是与平台相关的。

1
Sun Microsystems发布了不同版本的JDK,其中一个是基于Windows的,另一个是基于Linux/Unix的。当我们安装了JDK后,就会得到JVM、JRE和Java编译器。假设我们在安装了Windows JDK的Intel处理器上编写了一个Java程序,那么该JDK的Java编译器将把.java文件转换为.class文件,其中包含类似汇编语言代码的字节码指令,这些字节码指令只能被JVM理解。如果我们将在Windows操作系统中生成的.class文件拿到Linux中运行,那么该Linux机器的JVM会使用由JavaSoft人员开发并作为JVM的一部分放置的约200多个指令集来内部重写您的Java程序,然后执行.class文件。因此,要注意的重点是JDK是平台相关的,但.class文件并不是平台相关的,它是平台无关的,因为JVM负责运行任何.class文件。每个JDK的JVM内部都有预定义的指令集,即约200个以上。

1
Java语言只是一种语言,但许多其他设备(如手机)运行自己的版本,通常是为了适应设备而精简的版本。这些版本有时还可以具有其他专有类来帮助访问硬件(例如触摸屏)。通过基于主要平台创建单独的平台,您可以获得更多支持和更紧密、更高效的编程语言。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接