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

Java虚拟机新手困惑:编译Java时何时调用虚拟机,java,jvm,Java,Jvm,我刚刚开始学习java以进入android编程 我假设我使用java编译的所有东西都被编译成java字节码,而java字节码必须由虚拟机进行解释。因此javac filename.java生成filename.class,它具有要由JVM解释的字节码(至少我是这么想的,我会使用javafilename.class运行这个类文件)。但是如果我写这样的东西, public class Arrays { public static void main(String[] args) {

我刚刚开始学习java以进入android编程
我假设我使用java编译的所有东西都被编译成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]); 
  } 
}  

但是其他基于控制台的基本程序呢?再一次,转到android,在这种情况下,VM究竟在哪里被调用?或者我们应该将Android OS视为VM运行的一个非常复杂的浏览器,在Java中,我们使用java代码执行的任何东西都是在VM中执行的?< /P> < P>是的,<代码>。JVM(由
javafoo
foo.class
调用)解释(一些JVM在运行时将字节码转换为本机机器码)字节码。

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

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

这就是为什么Java有一个口号“一次编写,随处运行”,因为只要为操作系统提供了JVM,Java字节码就能够在该操作系统中运行

这真的只是一个C/C++程序,还是虚拟机仍然在后台被Windows调用

当您与控制台交互时,您无法区分它是Java还是c/c++程序。但java源代码确实已经编译成字节码(.class文件),然后在JVM上运行。您知道命令
javac
,还有另一个名为
java
的命令,它启动JVM并运行您的程序

在您的情况下,当您运行程序时,IDE调用命令
java
,后者在windows上启动JVM。JVM可以通过调用windows API解释
System.out.println()
以在控制台上显示内容

我知道浏览器需要安装VM才能运行类似的东西,但是其他基于控制台的基本程序呢

事实上,在运行任何java程序之前,我们必须在每个操作系统上安装JVM。对于浏览器,它只是一个调用安装在操作系统上的JVM的插件。与其他windows media player插件一样,您必须首先安装合适的windows media player

再一次,转到android,在这种情况下,VM究竟在哪里被调用?或者我们应该将Android OS视为一个非常复杂的浏览器,在VM运行的时候,我们使用java代码执行的任何东西都在这个VM?< /P>中执行。
所以,安卓操作系统不是一个浏览器,而是一个操作系统。它集成了JVM,因为您可以一次运行java程序。

java编译器(javac)是用java实现的,它在jdk/lib/tools.jar中。当我们启动javac时,它调用JVM(JVM是在本机代码中实现的,在Windows中是JVM.dll),并用它运行编译器类。

VM是编译器的一部分。编译时,会调用VM,并使用它在应用程序中进行加载。尽管它很简单,但它仍然被调用。无论您使用它来启动Java程序,它都知道如何启动Java程序。如果这需要调用VM,那么它就是这样做的。那么
javac
是编译器,而
java
是VM?还是
java
调用VM?在这种情况下,
java
命令在做什么?它只是在运行我的程序,还是还需要进一步编译.class文件?javac(compile)不调用VM,而java(runtime)调用VM。只需将JVM视为可以执行java程序的环境。请注意,java可执行文件是调用VM的文件,VM将在操作系统(例如Windows)中运行某些任务。这意味着Windows不是调用Java的那个。
import javax.swing.*; 
import java.awt.*; 

public class Applet1 extends JApplet { 
  public void init() { 
    getContentPane().add(new JLabel("Applet!")); 
  } 
}