我刚刚开始学习java进入android编程
我假设我使用java编译的所有东西都被编译为java字节码,必须由虚拟机解释。所以javac filename.java
生成filename.class
,其中包含要由JVM解释的字节码(至少我认为是这样,我将使用java filename.class
运行此类文件)。但是,如果我写这样的话,
public class Arrays {
public static void main(String[] args) {
int[] a1 = { 1, 2, 3, 4, 5 };
int[] a2;
a2 = a1;
for(int i = 0; i < a2.length; i++)
a2[i]++;
for(int i = 0; i < a1.length; i++)
System.out.println(
"a1[" + i + "] = " + a1[i]);
}
}
它只是在控制台上显示一些消息,看起来与C / C ++输出没什么不同。这真的只是一个C / C ++程序,还是Windows仍然在后台以某种方式调用VM?我知道浏览器需要安装VM才能运行
import javax.swing.*;
import java.awt.*;
public class Applet1 extends JApplet {
public void init() {
getContentPane().add(new JLabel("Applet!"));
}
}
但是其他基于控制台的基本程序呢?再一次,继续前进到android,在这种情况下VM的调用究竟是什么?或者我们应该将Android操作系统视为运行VM的非常精细的浏览器,我们使用java代码执行的任何操作都会在此VM中执行?
答案 0 :(得分:7)
Javac(compile)不会调用VM,它只会将您的java代码转换为字节码。而Java(运行时)调用VM。
将JVM视为一个可以在操作系统中安全地执行java程序的环境。请注意,您的java可执行文件是调用VM的,它将在您的操作系统中运行某些任务(例如,Windows / Android内核)。
这就是为什么Java有一个口号“一次编写运行”,因为只要有一个为操作系统提供的JVM,java字节码就能在该操作系统中运行。
答案 1 :(得分:1)
这真的只是一个C / C ++程序,还是Windows仍然在后台以某种方式调用VM?
当您与控制台交互时,您无法区分它是Java还是c / c ++程序。但是你的java源代码已被编译为字节代码(.class文件),然后在JVM上运行。您知道命令javac
,还有另一个名为java
的命令,它启动JVM并运行您的程序。
在您的情况下,当您运行程序时,IDE会调用命令java
,后者会在Windows上启动JVM。 JVM可以通过调用Windows API来解释System.out.println()
以在控制台上显示内容。
据我所知,浏览器需要安装此类虚拟机才能运行,但其他基于控制台的基本程序呢?
事实上,在运行任何java程序之前,我们必须在每个操作系统上安装JVM。对于浏览器,它只是一个调用操作系统上安装的JVM的插件。与其他Windows媒体播放器插件一样,您必须先安装合适的Windows媒体播放器。
再一次,转向android,在这种情况下VM究竟会被调用吗?或者我们应该将Android操作系统视为运行VM的非常精细的浏览器,我们使用java代码执行的任何操作都会在此VM中执行?
因此,Android OS不是浏览器而是操作系统。它集成了JVM,您可以立即运行java程序。
答案 2 :(得分:0)
是的,.class
文件是JVM字节码。 JVM(由java foo
为foo.class
调用)将字节码(在运行时将字节码JIT解释为本地机器代码)字节码。
答案 3 :(得分:0)
Java编译器(javac)是用Java实现的,它位于jdk / lib / tools.jar中。当我们启动javac时,它调用JVM(JVM在本机代码中实现,在Windows的情况下是jvm.dll)并使用它运行编译器类。