Java核心技术面试精讲-01 谈谈你对Java平台的理解?

问题一:Java程序运行步骤

首先,我们需要知道,Java语言在运行过程中都经历了哪些过程:
Java运行过程
这里有几个易混的概念
儿子和女儿——解释器和编译器的区别与联系
解释器是一条一条的解释执行源语言。比如php,postscritp,javascript就是典型的解释性语言。  
编译器是把源代码整个编译成目标代码,执行时不再需要编译器,直接在支持目标代码的平台上运行,这样执行效率比解释执行快很多。比如C语言代码被编译成二进制代码(exe程序),在windows平台上执行。
Java核心技术面试精讲-01 谈谈你对Java平台的理解?_第1张图片
为什么编译器比解释器的效率要高呢?因为省去了儿子思考的时间,这也要提醒我们,磨刀不误砍柴工,做事之前先做好计划。

我们发现,Java既有编译器又有解释器,而且是先编译后解释,这又是怎么一回事呢?其实Java是一门预编译语言。
首先,为了满足跨平台的需求,Java在后端执行上使用了解释器(其内嵌于JVM中,所以说JVM是Java跨平台执行的关键所在),而在执行之前,需要编译器先做初步的处理。我的直接理解是:原来编译器模式后端直接就是执行平台,而预编译模式后端是解释器,当然,在预编译模式中,编译器生成的中间文件只有特定平台对应的解释器才能看懂并翻译,也就是说这条短信是加密的,只有发送和接收双方才能看懂。对比上面我们引用的博客的举例,大致过程是这样的:首先由女儿收到母亲的信息,然后编辑短信(即中间语言,在Java里是.class字节码文件)发送给儿子,然后儿子再执行。这样不仅可以满足跨平台的需求,而且还可以增加效率。

问题二:JRE与JDK的区别

JRE(Java Runtime Enviroment)是Java的运行环境。面向Java程序的使用者,而不是开发者。如果你仅下载并安装了JRE,那么你的系统只能运行Java程序。JRE是运行Java程序所必须环境的集合,包含JVM标准实现及 Java核心类库。它包括Java虚拟机、Java平台核心类和支持文件。它不包含开发工具(编译器、调试器等)。在这里我是这么理解的:在前面我们说到,由于JVM的存在Java实现了跨平台的功能,所以一个平台是否支持Java的运行其要点在于是否有解释器,所以作为Java的运行环境,JRE一定要包含解释器。用儿子女儿的话说就是:JRE是一个执行者(运行环境),所以是儿子。
JDK(Java Development Kit)又称J2SDK(Java2 Software Development Kit),是Java开发工具包,它提供了Java的开发环境(提供了编译器javac等工具,用于将java文件编译为class文件)和运行环境(提 供了JVM和Runtime辅助包,用于解析class文件使其得到运行)。如果你下载并安装了JDK,那么你不仅可以开发Java程序,也同时拥有了运 行Java程序的平台。JDK是整个Java的核心,包括了Java运行环境(JRE),一堆Java工具tools.jar和Java标准类库 (rt.jar)。在这里我是这么理解的:JDK是一个计划者(开发),所以是女儿。
用一句话进行总结:jre为java提供了必要的运行时环境,jdk为java提供了必要的开发环境!

问题三:说明一下Java一次编译、到处运行这一语言特性

“一次编译、到处运行”说的是Java语言跨平台的特性,Java的跨平台特性与Java虚拟机的存在密不可分,可在不同的环境中运行。比如说Windows平台和Linux平台都有相应的JDK,安装好JDK后也就有了Java语言的运行环境。其实Java语言本身与其他的编程语言没有特别大的差异,并不是说Java语言可以跨平台,而是在不同的平台都有可以让Java语言运行的环境而已,所以才有了Java一次编译,到处运行这样的效果。
严格的讲,跨平台的语言不止Java一种,但Java是较为成熟的一种。“一次编译,到处运行”这种效果跟编译器有关。编程语言的处理需要编译器和解释器。Java虚拟机和DOS类似,相当于一个供程序运行的平台。
程序从源代码到运行的三个阶段:编码——编译——运行——调试。Java在编译阶段则体现了跨平台的特点。编译过程大概是这样的:首先是将Java源代码转化成.CLASS文件字节码,这是第一次编译。.class文件就是可以到处运行的文件。然后Java字节码会被转化为目标机器代码,这是是由JVM来执行的,即Java的第二次编译。
“到处运行”的关键和前提就是JVM。因为在第二次编译中JVM起着关键作用。在可以运行Java虚拟机的地方都内含着一个JVM操作系统。从而使JAVA提供了各种不同平台上的虚拟机制,因此实现了“到处运行”的效果。需要强调的一点是,java并不是编译机制,而是解释机制,当然,也可以说成是预编译解释机制(解释为主)。
Java语言具有跨平台的特性,也正是因为虚拟机的存在。Java源文件被编译成字节码,被虚拟机加载后执行。这里隐含的意思有两层:
1)大部分情况下,编程者只需要关心Java语言本身,而无需特意关心底层细节。包括对内存的分配和回收,也全权交给了GC。
2)对于虚拟机而言,只要是符合规范的字节码,它们都能被加载执行,当然,能正常运行的程序光满足这点是不行的,程序本身需要保证在运行时不出现异常。

你可能感兴趣的:(Java核心技术)