首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Java虚拟机新手混淆:编译java时调用虚拟机的时间

Java虚拟机新手混淆:编译java时调用虚拟机的时间
EN

Stack Overflow用户
提问于 2013-07-18 14:02:31
回答 4查看 367关注 0票数 0

我刚刚开始学习java以进入android编程。

我假设我使用java编译的所有东西都被编译成java字节码,它必须由虚拟机解释。因此,javac filename.java生成了filename.class,它具有要由JVM解释的字节码(至少我是这么想的,我会使用java filename.class运行这个类文件)。然而,如果我写这样的东西,

代码语言:javascript
复制
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调用?我知道浏览器需要安装虚拟机,这样才能运行

代码语言:javascript
复制
import javax.swing.*; 
import java.awt.*; 

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

但是其他基于控制台的基本程序呢?再来看看android,在这种情况下,虚拟机到底是在哪里被调用的?或者,我们是否应该将android OS视为一个非常复杂的浏览器,在这里VM正在运行,我们使用java代码执行的任何东西都会在这个VM中执行?

EN

回答 4

Stack Overflow用户

回答已采纳

发布于 2013-07-18 14:24:46

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

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

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

票数 7
EN

Stack Overflow用户

发布于 2013-07-18 14:37:28

是否真的只是像C/C++程序一样,还是虚拟机仍然在后台被Windows以某种方式调用?

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

在本例中,当您运行程序时,集成开发环境调用命令java,后者在windows上启动JVM。JVM可以通过调用windows API来解释System.out.println(),在控制台上显示内容。

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

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

,再来看看android,在这种情况下,虚拟机到底是在哪里被调用的?或者,我们是否应该将android OS视为一个非常复杂的浏览器,在这里VM正在运行,我们使用java代码执行的任何东西都会在这个VM中执行?

因此,android操作系统不是浏览器,而是操作系统。它集成了JVM,可以一次运行java程序。

票数 1
EN

Stack Overflow用户

发布于 2013-07-18 14:07:44

是的,.class文件是JVM字节码。JVM (由用于foo.classjava foo调用)解释(一些JVM在运行时将字节码JIT成本机代码)字节码。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/17715672

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档