9

我知道 Java 的一大优点是它是平台独立的,你可以制作一个 Java 应用程序并让它在 Windows、Linux、Mac 等平台上运行,只要你不使用库特定于一个操作系统,并且只要您为适当的操作系统安装了 JVM 以正确解释事物...

但是,为什么一个普通的计算机 Java 程序(例如在 Java 中的一个简单的 Hello World,例如 Windows 或 Linux)不能在手机中同样运行,而手机也安装了特定的 JVM 以正确解释事物?

为什么在某些情况下需要改变程序的架构,比如Android开发,或者使用Java ME做一些通用手机专用的应用程序?

我知道有些功能与操作系统的某些功能相关,可能不适用于移动平台,例如与控制台、输入法等相关的一些东西,但这真的是唯一的原因这使得事情不兼容?如果是这样,为什么只声明和初始化一个整数变量的简单应用程序不能在所有具有可用 JVM 的非移动和移动平台上运行?

我知道之前发布的其他问题,例如this,但这并没有集中我在这里瞄准的确切点。

4

5 回答 5

8

要查看的可移植性单元是而不是应用程序。声明和初始化整数变量的类在您描述的所有平台以及许多其他平台上运行。他们理解相同的字节码,即使他们确实使用不同的机制执行它,从字节码解释器到 JIT 编译,再到 Android 的 Dalvik(将 JVM 字节码翻译成自己的指令集)。

即使我们超越单个整数变量,使用“核心”功能的 Java可以在大多数这些设备上工作。J2ME、Android 和 J2SE 之间有很多共同点(尤其是后两者 - J2ME 旨在作为标准 Java API 的精简版本,用于资源有限的设备,因此可用的标准 API 较少)。

在 Windows/Mac/Linux 系统上,应用程序通常是您明确启动、使用的东西,并且 - 完成后 - 告诉它退出。将其与 Android 手机进行比较:应用程序可能会启动以响应发生的事件(可能是传入的 SMS,或从 Web 下载的特定类型的文件),在这种情况下,它需要知道它是如何发生的以及为什么发生开始 - 一个简单的public static main(String[] args)只是不削减它。启动后,应用程序需要了解诸如“电池电量不足”或“进入待机模式”等事件,以释放资源或禁用 CPU 密集型功能(如 GPS),否则可能会耗尽电池电量。

这些并不是晦涩难懂的功能——它们对于手机作为手机有用是必不可少的——因此所有原生应用程序都必须处理它们。

于 2010-11-10T00:25:31.720 回答
5

编译 Java 代码时会生成一个独立于系统的字节码(类文件)。该字节码被馈送到驻留在系统中的 JVM(Java 虚拟机)。由于每个系统都有自己的 JVM,因此在哪里编译源代码并不重要。编译器生成的字节码可以被任何机器的任何JVM解释。因此,它被称为平台无关语言。

谢谢

于 2011-10-23T16:05:08.363 回答
2

为什么Java理论上是平台独立的,实际上是平台依赖的?

记住并清楚一件事,只有 Java 语言是平台无关的,并尝试理解句子的含义。Java 是独立于平台的,这意味着您使用 Java 开发的代码可以在任何机器上运行。

当您编译.java文件时,它会生成.class文件并包含字节码,并且此字节码与平台无关,您可以在任何机器上运行它,这就是 Java 语言的平台无关性。

现在你说它不是在实践中所以原因只是Java语言是平台独立的,但它的运行时环境,或JVM,是平台相关的,它是为每个操作系统单独编写的。所以我们可以说Java语言是平台无关的,但它的运行环境是平台相关的。

于 2013-10-16T17:49:27.017 回答
1

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

于 2010-11-10T00:24:37.217 回答
1

Sun micro systems 发布了不同版本的 jdk。一个用于基于 Windows 的,另一个用于基于 linux/unix 的。当我们安装 jdk 时,我们得到 jvm、jre 和 javac。假设如果我们在安装了windows jdk的intel处理器的windows中编写一个java程序,那么该jdk的java编译器会将.java文件转换为.class文件,其中包含类似于汇编语言代码的字节码指令,这些字节码指令可以只有 jvm 才能理解。如果我们采用在 windows os 中生成的 .class 文件,并且如果我们在 linux 中运行,那么该 linux 机器的 jvm 会使用大约 200 多个指令集在内部重写您的 java 程序,这些指令集由 javasoft 人员开发并作为虚拟机。并且 .class 文件被执行。所以这里的重点是集中 jdk 依赖于平台,但 .class 不依赖于平台,它是平台独立的,因为 jvm 只负责运行任何 .class 文件。每个 jdk 的 jvm 内部都有预定义的指令集,即大约。200+。

于 2014-01-08T13:04:24.217 回答