跨平台/可移植性
这是Java的核心优势。Java在设计时就很重视移植和跨平台的问题。eg: Java的int永远都是32位。
安全性
Java适合网络/分布式环境
面向对象
面向对象是一种程序设计思想,适合大型软件的设计和开发。C++由于兼容C,使自身成为了带类的C语言,而Java则是完全的面向对象语言
简单性
Java是C++语法的简化版。把C++的一些内容去掉了,eg: 头文件、指针、结构、联合、操作符重载、虚基类等。 但是语法也是基于C的。
高性能
Java语言自身发展中通过虚拟机的优化提升了几十倍运行效率。比如,通过JIT(Just in time)即时编译技术提高运行效率。将一些热点字节码编译成本地机器码,并将结果缓存起来,在需要的时候重新调用。
6.分布式
Java是为Internet的分布式环境设计的,因为它能处理TCP/IP协议。事实上,通过URL访问一个网络资源和访问本地文件是一样简单的。Java还支持远程方法调用RMI(Romote Method Invocation)使程序能通过网络调用方法。
7.多线程
多线程的使用可以带来更好的交互响应和实时行为。Java多线程的简单性是Java成为主流服务器端开发语言的主要原因之一。
8.健壮性
Java是一种健壮的语言,吸收了C/C++语言的有点,但去掉了其影响程序健壮性的部分(比如指针、内存的申请和释放等)
源文件(.java)编译 字节码文件(.class)解释执行 JVM for Windows/Unix/Other
Java SE: Java的标准版,是基础和核心。也是Java EE 和 Java ME的基础,主要用于开发桌面应用程序。
Java ME: Java的微缩版,主要应用于嵌入式开发,比如手机程序的开发。
Java EE: Java的企业版,提供企业级应用开发的完整解决发难,比如开发网站和企业的一些应用系统,是Java应用最广泛的领域。目前还是主要偏向于Web开发。
JDK : Java Development Kit
包含了编译器和调试器等用于程序开发的文件
JRE: Java Runtime Environment
包含了Java虚拟机、库函数、运行Java应用程序和Applet所必须的文件
Java运行环境的三项主要功能:
加载代码:由 class loader完成
校验代码:由 bytecode verifier完成
执行代码: 由runtime interpreter 完成
区别和联系:
JDK是JRE的超集,是在JRE基础上增加了编译器和其他的开发工具
JRE就是java运行时的环境,包括了JVM和其他一些java核心api,任何一台电脑,只有安装了JRE才能运行Java程序
如果只需要运行Java程序,那么只需要JRE(通常很小,包含了JVM),但是如果要开发Java程序,就需要安装JDK.
JVM: Java Virtual Machine
JVM是一种规范,可以使用软件来实现,也可以使用硬件来实现,就是一个虚拟的用于执行byte-codes字节码的计算机。他也定义了指令集、寄存器集、结构栈、垃圾收集堆、内存区域。
JVM负责将Java字节码解释运行,边解释边运行,这样速度会受到影响。JAVA提供了另一种解释运行的方法JIT(Just in time),可以一次解释完,再运行特定平台的机器码。
JVM是指在一台计算机上由软件或者硬件模拟的计算机,类似于一个小巧而高效的CPU.
byte-code代码是与平台无关的,是虚拟机的机器指令
java字节码运行的两种方式
interpreter(解释)
运行时解释字节码并执行
Just-in-time(即时编译)
由代码生成器将字节码转换成本机的机器码,可以以较高速度执行
Java跨平台实现的核心就在于不同的平台使用不同的虚拟机
不同的操作系统有不同的虚拟机,Java虚拟机屏蔽了底层运行平台的差别,实现了“一次编译,随处运行”。
编译型语言先将源码编译成机器语言,再由机器运行机器码,这样执行效率比较高,C和C++都是编译型语言
解释性语言在运行时才进行编译,每次运行都需要编译,效率比较低。JavaScript, Python都是解释型语言
书籍翻译就是编译,同声传译就是解释。编译效率高,翻译一次可以多次运行;解释效率低,每次运行都需要重新翻译,但是跨平台性好。
Java属于二者都有,既有编译过程,又是解释型语言。
Java语言虽然比较接近解释型特征,但是在执行之前已经预先进行了一次预编译,生成的是介于机器码和Java源码之间的中介代码,运行的时候则是由Java虚拟机解释执行。
第一步:编译
利用编译器(javac)将源程序编译成字节码文件 字节码文件名:原文件名.class
第二步:运行
利用解释器(虚拟机 JVM)解释执行class字节码文件