Java虚拟机新手困惑:在编译java时何时调用虚拟机

use*_*267 0 java jvm

我刚刚开始学习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]); 
  } 
}  
Run Code Online (Sandbox Code Playgroud)

它只是在控制台上显示一些消息,看起来与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!")); 
  } 
}  
Run Code Online (Sandbox Code Playgroud)

但是其他基于控制台的程序呢?再一次,继续前进到android,在这种情况下VM的调用究竟是什么?或者我们应该将Android操作系统视为运行VM的非常复杂的浏览器,我们使用java代码执行的任何操作都会在此VM中执行?

Rud*_*udy 7

Javac(compile)不调用VM,它只将您的java代码转换为字节码.而Java(运行时)调用VM.

只需将JVM视为可以在操作系统中安全地执行Java程序的环境.请注意,您的java可执行文件是调用VM的,它将在您的操作系统中运行某些任务(例如,Windows/Android内核).

这就是为什么Java有一个口号"一次编写一次运行",因为只要有一个为操作系统提供的JVM,java字节码就能在该操作系统中运行.

在此输入图像描述