JAVA简介
Java是一种广泛使用的计算机编程语言,拥有跨平台、面向对象、泛型编程的特性,广泛应用于企业级Web应用开发和移动应用开发。
任职于Sun微系统的詹姆斯·高斯林等人于1990年代初开发Java语言的雏形,最初被命名为Oak,目标设置在家用电器等小型系统的编程语言,应用在电视机、电话、闹钟、烤面包机等家用电器的控制和通信。由于这些智能化家电的市场需求没有预期的高,Sun微系统放弃了该项计划。随着1990年代互联网的发展,Sun微系统看见Oak在互联网上应用的前景,于是改造了Oak,于1995年5月以Java的名称正式发布。Java伴随着互联网的迅猛发展而发展,逐渐成为重要的网络编程语言。
Java编程语言的风格十分接近C++语言。继承了C++语言面向对象技术的核心,舍弃了容易引起错误的指针,以引用取代;移除了C++中的运算符重载和多重继承特性,用接口取代;增加垃圾回收器功能。在Java SE 1.5版本中引入了泛型编程、类型安全的枚举、不定长参数和自动装/拆箱特性。Sun微系统对Java语言的解释是:“Java编程语言是个简单、面向对象、分布式、解释性、健壮、安全、与系统无关、可移植、高性能、多线程和动态的语言”。Java不同于一般的编译语言或解释型语言。它首先将源代码编译成字节码,再依赖各种不同平台上的虚拟机来解释执行字节码,从而具有“一次编写,到处运行”的跨平台特性。在早期JVM中,这在一定程度上降低了Java程序的运行效率。但在J2SE1.4.2发布后,Java的执行速度有了大幅提升。与传统类型不同,Sun微系统在推出Java时就将其作为开放的技术。全球的Java开发公司被要求所设计的Java软件必须兼容。“Java语言靠群体的力量而非公司的力量”是Sun微系统的口号之一,并获得了广大软件开发商的认同。这与微软公司所倡导的注重精英和封闭式的模式完全不同,此外,微软公司后来推出了与之竞争的.NET平台以及模仿Java的C#语言。后来Sun微系统被甲骨文公司并购,Java也随之成为甲骨文公司的产品。目前,移动操作系统Android大部分的代码采用Java编程语言编程。
基本信息
设计者:詹姆斯·高斯林、太阳计算机系统公司
发行时间:1995年
类型系统:静态、安全、强类型、标明类型
许可证:GNU通用公共许可协议、JCP
文件扩展名:.java、.class、.jar
官方网站:https://www.java.com/
历史
开放源代码项目
2006年Sun微系统在JavaOne公布Java 开放源代码项目,并推出OpenJDK计划。Java虚拟机、Java编译器和Java类库以GNU通用公共许可证公开。
版本历史
●1995年5月23日,Java语言诞生
●1996年1月,第一个JDK-JDK1.0诞生
●1996年4月,10个最主要的操作系统供应商申明将在其产品中嵌入JAVA技术
●1996年9月,约8.3万个网页应用了JAVA技术来制作
●1997年2月18日,JDK1.1发布
●1997年4月2日,JavaOne会议召开,参与者逾一万人,创当时全球同类会议规模之纪录
●1997年9月,JavaDeveloperConnection社区成员超过十万
●1998年2月,JDK1.1被下载超过2,000,000次
●1998年12月8日,JAVA2企业平台J2EE发布
●1999年6月,Sun微系统发布Java的三个版本:标准版(J2SE)、企业版(J2EE)和微型版(J2ME)
●2000年5月8日,JDK1.3发布
●2000年5月29日,JDK1.4发布
●2001年6月5日,NOKIA宣布,到2003年将出售1亿部支持Java的手机
●2001年9月24日,J2EE1.3发布
●2002年2月26日,J2SE1.4发布,自此Java的计算能力有了大幅提升
●2004年9月30日18:00PM,J2SE1.5发布,成为Java语言发展史上的又一里程碑。为了表示该版本的重要性,J2SE1.5更名为Java SE 5.0
●2005年6月,JavaOne大会召开,Sun微系统公开Java SE 6。此时,Java的各种版本已经更名,以取消其中的数字“2”:J2EE更名为Java EE,J2SE更名为Java SE,J2ME更名为Java ME
●2006年12月,Sun微系统发布JRE6.0
●2009年12月,Sun微系统发布Java EE 6
●2010年11月,由于Oracle公司对于Java社群的不友善,因此Apache扬言将退出JCP
●2011年7月28日,Oracle公司发布Java SE 7
●2014年3月18日,Oracle公司发布Java SE 8
●2017年9月21日,Oracle公司发布Java SE 9
●2018年3月21日,Oracle公司发布Java SE 10
●2018年9月25日,Oracle公司发布Java SE 11 (LTS)
●2019年3月,Oracle公司发布Java SE 12
●2019年9月,Oracle公司发布Java SE 13
●2020年3月,Oracle公司发布Java SE 14
●2020年9月,Oracle公司发布Java SE 15
●2021年3月,Oracle公司发布Java SE 16
●2021年9月,Oracle公司发布Java SE 17
●2022年3月,Oracle公司发布Java SE 18
●2022年9月,Oracle公司发布Java SE 19
●2023年3月,Oracle公司发布Java SE 20
版本使用
目前Java提供以下三个版本:
●Java Platform, Enterprise Edition(Java EE:Java平台企业版)[常用于Web方向的网站开发]
●Java Platform, Standard Edition(Java SE:Java平台标准版)[用于桌面应用的开发,是其他版本的基础]
●Java Platform, Micro Edition(Java ME:Java平台微型版)[面向嵌入式等设备应用的开发]
语言特性
Java可以实现以下五个目的:
●应当使用面向对象程序设计方法学
●应当允许同一程序在不同的计算机平台执行
●应当包括内置的对计算机网络的支持
●应当被设计成安全地执行远端代码
●应当易于使用,并借鉴以前那些面向对象语言(如C++)的长处。
面向对象
Java的特点之一就是面向对象,是程序设计方法的一种。“面向对象程序设计语言”的核心之一就是开发者在设计软件的时候可以使用自定义的类型和关联操作。代码和数据的实际集合体叫做“对象”。一个对象可以想象成绑定了很多“行为(代码)”和“状态(数据)”的物体。对于数据结构的改变需要和代码进行通信然后操作,反之亦然。面向对象设计让大型软件工程的计划和设计变得更容易管理,能增强工程的健康度,减少失败工程的数量。
跨平台性
跨平台性是Java主要的特性之一,跨平台使得用Java语言编写的程序可以在编译后不用经过任何更改,就能在任何硬件设备条件下运行。这个特性经常被称为“一次编译,到处运行”。
自动垃圾回收(Garbage Collection)
C++语言被用户诟病的原因之一是大多数C++编译器不支持垃圾收集机制。通常使用C++编程的时候,程序员于程序中初始化对象时,会在主机存储器堆栈上分配一块存储器与地址,当不需要此对象时,进行析构或者删除的时候再释放分配的存储器地址。如果对象是在堆栈上分配的,而程序员又忘记进行删除,那么就会造成存储器泄漏(Memory Leak)。长此以往,程序运行的时候可能会生成很多不清除的垃圾,浪费了不必要的存储器空间。而且如果同一存储器地址被删除两次的话,程序会变得不稳定,甚至崩溃。因此有经验的C++程序员都会在删除之后将指针重置为NULL,然后在删除之前先判断指针是否为NULL。C++中也可以使用“智能指针”(Smart Pointer)或者使用C++托管扩展编译器的方法来实现自动化存储器释放,智能指针可以在标准类库中找到,而C++托管扩展被微软的Visual C++ 7.0及以上版本所支持。智能指针的优点是不需引入缓慢的垃圾收集机制,而且可以不考虑线程安全的问题,但是缺点是如果不善使用智能指针的话,性能有可能不如垃圾收集机制,而且不断地分配和释放存储器可能造成存储器碎片,需要手动对堆进行压缩。除此之外,由于智能指针是一个基于模板的功能,所以没有经验的程序员在需要使用多态特性进行自动清理时也可能束手无策。
Java语言则不同,上述的情况被自动垃圾收集功能自动处理。对象的建立和放置都是在存储器堆栈上面进行的。当一个对象没有任何引用的时候,Java的自动垃圾收集机制就发挥作用,自动删除这个对象所占用的空间,释放存储器以避免存储器泄漏。注意程序员不需要修改finalize方法,自动垃圾收集也会发生作用。但是存储器泄漏并不是就此避免了,当程序员疏忽大意地忘记解除一个对象不应该有的引用时,存储器泄漏仍然不可避免。
不同厂商、不同版本的JVM中的存储器垃圾回收机制并不完全一样,通常越新版本的存储器回收机制越快,IBM、BEA、Sun微系统等等开发JVM的公司都曾宣称过自己制造出了世界上最快的JVM,JVM性能的世界纪录也在不断的被打破并提高。IBM有一篇有关Java存储器回收机制比不激活垃圾收集机制的C++存储器处理快数倍的技术文章,而著名的Java技术书籍《Java编程思想》(Thinking in Java)也有一段论述Java存储器及性能达到甚至超过C++的章节。
运行机制
运行流程
Java是编译型语言与解释型语言的结合体。Java程序运行时,必须经过编译和运行两个步骤。首先对后缀名为.java的源文件进行编译,生成后缀名为.class的字节码文件。然后java虚拟机对字节码文件进行解释执行,并将结果显示出来。
编译运行过程如下:
①编写Hello World.java文件。
1 | public class HelloWorld { |
②使用“javac Hello World.java”命令运行Java编译器编译HelloWorld.java文件,编译结束后生成一个名为HelloWorld.class的字节码文件。
③使用“java HelloWorld”命令运行Java虚拟机,Java虚拟机首先将编译好的字节码文件加载到内存,这个过程称为类加载,由类加载器完成。然后Java虚拟机针对加载到内存中的Java类进行解释执行,输出运行结果。
整个过程Java程序是由虚拟机负责解释执行的,而并非操作系统。这样就可以实现Java程序的跨平台,即在不同的操作系统上安装不同版本的Java虚拟机就可以运行相同的Java程序编译好的字节码文件。
JVM(Java Virtual Machine)
1.JVM即Java虚拟机,是Java字节码执行的引擎,为java程序的执行提供必要的支持,能优化java字节码,使之转换成效率更高的机器指令。程序员编写的程序最终都要在JVM上执行,JVM中类的装载是由类加载器(ClassLoader)和它的子类来实现的。
2.ClassLoader是java运行时一个重要的系统组件,负责在运行时查找和装入类文件的类。
3.JVM屏蔽了与具体操作系统平台相关的信息,从而实现了java程序只需生成在JVM上运行的字节码文件(class文件),就可以在多种平台上不加修改地运行。不同平台对应着不同的JVM,在执行字节码时,JVM负责将每一条要执行的字节码送给解释器,解释器再将其翻译成特定平台环境的机器指令并执行。java语言最重要的特点就是跨平台运行,使用JVM就是为了支持与操作系统无关,实现跨平台运行。
ClassLoader
1.是JVM实现的一部分,包括bootstrapclassloader(启动类加载器)
2.ClassLoader在JVM运行的时候加载java核心的API,通过java程序实现两个ClassLoader:
①ExtClassLoader,它的作用是用来加载java的扩展API,也就是lib\ext类;
②AppClassLoader,用来加载用户机器上CLASSPATH设置目录中的Class.
3.ClassLoader加载流程:当运行一个程序的时候,JVM启动,运行bootstrapclassloader,该ClassLoader加载java核心API,然后调用ExtClassLoader加载扩展API,最后AppClassLoader加载CLASSPATH目录下定义的Class.
JRE(Java Runtime Environment)
JRE即java运行时环境,它是java程序运行所必须的环境集合,主要由java虚拟机、java平台核心类和若干支持文件组成。其不包含开发工具、编译器、调试器以及其他工具。
在执行java程序的时候,操作系统会按照下面顺序寻找JRE环境。
①先查找当前目录下有没有JRE
②再查找父目录下有没有JRE
③接着在环境变量PATH制定的路径中查找JRE
④注册表查看CurrentVersion的键值指向哪个JRE
JRE自带的基础类库主要在JRE\LIB\rt.jar文件中。在程序运行时,JRE由ClassLoader(类加载器)负责查找和加载程序引用到的基类库和其他类库。基础类库,Classloader会自动到rt.jar的位置;其他的类库,ClassLoader在环境变量CLASSPATH制定的路径中搜索。
JDK(Java Development Kit)
JDK即java开发工具包。JDK是java的核心,它包括java运行环境、一系列java工具和java基础的类库(rt.jar)。JDK包含JRE的全部内容外,还包含开发者用以编译、调试和运行java程序的工具。
JDK,JRE和JVM之间的关系
JDK包含了JRE和JVM,JRE包含了JVM。JDK是开发Java程序必备的工具,而JRE则是Java程序运行的必备环境。
基本语法
●大小写敏感:Java是大小写敏感的,这就意味着标识符Hello
与hello
是不同的。
●类名:对于所有的类来说,类名的首字母应该大写。如果类名由若干单词组成,那么每个单词的首字母应该大写,例如MyFirstJavaClass
。
●方法名:所有的方法名都应该以小写字母开头。如果方法名含有若干单词,则后面的每个单词首字母大写,例如myFirstJavaMethod
。
●源文件名:源文件名必须和文件内名字唯一且公开(由public 关键词修饰)的类名相同。当保存文件的时候,你应该使用该类名作为文件名保存(切记Java是大小写敏感的),文件名的后缀为.java
。(如果文件名和类名不相同则会导致编译错误)。
●主方法入口:所有的Java程序由public static void main(String[] args)
方法开始执行。
Java关键字
这些关键字不能用于常量、变量、和任何标识符的名称。
类别 | 关键字 | 说明 |
---|---|---|
访问控制 | private | 私有的 |
protected | 受保护的 | |
public | 公共的 | |
类、方法和变量修饰符 | abstract | 声明抽象 |
class | 类 | |
extends | 扩充,继承 | |
final | 最终值,不可改变的 | |
implements | 实现(接口) | |
interface | 接口 | |
native | 本地,原生方法(非Java实现) | |
new | 新,创建 | |
static | 静态 | |
strictfp | 严格,精准 | |
synchronized | 线程,同步 | |
transient | 短暂 | |
volatile | 易失 | |
程序控制语句 | break | 跳出循环 |
case | 定义一个值以供switch选择 | |
continue | 继续 | |
default | 默认 | |
do | 运行 | |
else | 否则 | |
for | 循环 | |
if | 如果 | |
instanceof | 实例 | |
return | 返回 | |
switch | 根据值选择执行 | |
while | 循环 | |
错误处理 | assert | 断言表达式是否为真 |
catch | 捕捉异常 | |
finally | 有没有异常都执行 | |
throw | 抛出一个异常对象 | |
throws | 声明一个异常可能被抛出 | |
try | 捕获异常 | |
包相关 | import | 引入 |
package | 包 | |
基本类型 | boolean | 布尔型 |
byte | 字节型 | |
char | 字符型 | |
double | 双精度浮点 | |
float | 单精度浮点 | |
int | 整型 | |
long | 长整型 | |
short | 短整型 | |
null | 空 | |
变量引用 | super | 父类,超类 |
this | 本类 | |
void | 无返回值 | |
保留关键字 | goto | 是关键字,但不能使用 |
const | 是关键字,但不能使用 |
版权声明
Scholar’s Blog by scholargeek is licensed under a Creative Commons BY-NC-ND 4.0 International License.
由董仕麟创作并维护的scholargeek博客采用创作共用保留署名-非商业-禁止演绎4.0国际许可证。
本文首发于Scholar’s Blog博客,版权所有,侵权必究。