码农飞升记-01-Java是什么?

1.Java概述

Java 原名 Oak 是 Sun Microsystems 公司的 James Gosling 及其团队于 1995 年 5 月推出的 Java 程序设计语言Java 平台 的总称。

Java 是一种广泛使用的计算机编程语言,拥有跨平台面向对象泛型编程的特性,广泛应用于企业级Web应用开发和移动应用开发

Java 平台Java 虚拟机(Java Virtual Machine,JVM)Java 应用编程接口(Application Programming Interface,API) 构成。

2010 年 Sun MicrosystemsOracle 正式收购。

2.Java发展历程

Oak 的出现( Java 的雏形)

20世纪90年代,硬件领域出现了单片式计算机系统,这种价格低廉的系统一出现就立即引起了自动控制领域人员的注意,因为使用它可以大幅度提升消费类电子产品(如电视机顶盒、面包烤箱、移动电话等)的智能化程度。Sun Microsystems 公司为了抢占市场先机,在1991年成立了一个称为 Green 的项目小组,James Gosling 及其团队一起组成的工作小组在 State of CaliforniaMenlo Park 市沙丘路的一个小工作室里面研究开发新技术,专攻计算机在家电产品上的嵌入式应用。

由于 C++ 所具有的优势,该项目组的研究人员首先考虑采用 C++ 来编写程序。但对于硬件资源极其匮乏的单片式系统来说,C++ 程序过于复杂和庞大。另外由于消费电子产品所采用的嵌入式处理器芯片的种类繁杂,如何让编写的程序跨平台运行也是个难题。为了解决困难,他们首先着眼于语言的开发,假设了一种结构简单、符合嵌入式应用需要的硬件平台体系结构并为其制定了相应的规范,其中就定义了这种硬件平台的二进制机器码指令系统(即后来成为“字节码”的指令系统),以待语言开发成功后,能有半导体芯片生产商开发和生产这种硬件平台。对于新语言的设计,Sun 公司研发人员并没有开发一种全新的语言,而是根据嵌入式软件的要求,对 C++ 进行了改造,去除了留在 C++ 的一些不太实用及影响安全的成分,并结合嵌入式系统的实时性要求,开发了一种称为 Oak 的面向对象语言
由于在开发 Oak 语言时,尚且不存在运行字节码的硬件平台,所以为了在开发时可以对这种语言进行实验研究,他们就在已有的硬件和软件平台基础上,按照自己所指定的规范,用软件建设了一个运行平台,整个系统除了比 C++ 更加简单之外,没有什么大的区别。1992年的夏天,当 Oak 语言开发成功后,研究者们向硬件生产商进行演示了 Green 操作系统、Oak 的程序设计语言、类库和其硬件,以说服他们使用 Oak 语言生产硬件芯片,但是,硬件生产商并未对此产生极大的热情。因为他们认为,在所有人对 Oak 语言还一无所知的情况下,就生产硬件产品的风险实在太大了,所以 Oak 语言也就因为缺乏硬件的支持而无法进入市场,从而被搁置了下来。

1994年6、7月间,在经历了一场历时三天的讨论之后,团队决定再一次改变了努力的目标,这次他们决定将该技术应用于万维网。他们认为随着 Mosaic 浏览器的到来,因特网正在向同样的高度互动的远景演变,而这一远景正是他们在有线电视网中看到的。作为原型,帕特里克·诺顿写了一个小型万维网浏览器 WebRunner。

1995年 Java 的诞生

1995年,互联网的蓬勃发展给了 Oak 机会。业界为了使死板、单调的静态网页能够“灵活”起来,急需一种软件技术来开发一种程序,这种程序可以通过网络传播并且能够跨平台运行。于是,世界各大IT企业为此纷纷投入了大量的人力、物力和财力。这个时候,Sun 公司想起了那个被搁置起来很久的 Oak,并且重新审视了那个用软件编写的试验平台,由于它是按照嵌入式系统硬件平台体系结构进行编写的,所以非常小,特别适用于网络上的传输系统,而 Oak 也是一种精简的语言,程序非常小,适合在网络上传输。
Sun 公司首先推出了可以嵌入网页并且可以随同网页在网络上传输的 Applet(Applet是一种将小程序嵌入到网页中进行执行的技术),并将 Oak 更名为 Java(在申请注册商标时,发现 Oak 已经被人使用了,再想了一系列名字之后,最终,使用了提议者在喝一杯 Java 咖啡时无意提到的 Java 词语)。

1995年5月23日,Sun 公司在 Sun world 会议上正式发布 Java 和 HotJava 浏览器。IBMAppleDECAdobeHPOracleNetscapeMicrosoft 等各大公司都纷纷停止了自己的相关开发项目,竞相购买了 Java 使用许可证,并为自己的产品开发了相应的 Java 平台。

1996年 Sun 公司发布第一个 JDK

1996年1月23日,Sun 公司发布了 Java 的第一个开发工具包(JDK 1.0),这是 Java 发展历程中的重要里程碑,标志着 Java 成为一种独立的开发工具。9月,约8.3万个网页应用了 Java 技术来制作。10月,Sun 公司发布了 Java 平台的第一个即时编译器 JIT(Just-In-Time Compiler)

1996年4月,10个最主要的操作系统供应商申明将在其产品中嵌入JAVA技术。

1996年9月,约8.3万个网页应用了JAVA技术来制作。

1997年2月19日,JDK 1.1 面世,在随后的3周时间里,达到了22万次的下载量。

1997年4月2日,Java One 会议召开,参会者逾一万人,创当时全球同类会议规模之纪录。

1997年9月,Java Developer Connection 社区成员超过10万。

1998年2月,JDK1.1被下载超过2,00万次。

1998年12月用 J2SE 取代 JDK 命名,以区别 J2EE 和 J2ME 平台

1998年12月8日,JAVA2 企业平台 J2EE 发布,该版本到J2SE 5.0为止的后续版本被更名为 Java 2,而版本名称“J2SE”(Java 2平台,标准版)取代 JDK 以区别 J2EE(Java 2平台,企业版) 和 J2ME(Java 2 Platform,Micro Edition)基础平台。这是 Java 的一个非常重要的版本,它将 Java 平台的大小增加至原先的三倍,在59个程序包中达到了1520个类。

1999年4月27日,HotSpot 虚拟机发布。HotSpot 虚拟机发布时是作为 JDK 1.2 的附加程序提供的,后来它成为了 JDK 1.3 及之后所有版本的 Sun JDK 的默认虚拟机。

1999年6月,Sun 公司发布了第二代 Java 平台(简称为Java2)的3个版本:

J2ME(Java2 Micro Edition,Java2 平台的微型版),应用于移动、无线及有限资源的环境;

J2SE(Java 2 Standard Edition,Java 2 平台的标准版),应用于桌面环境;

J2EE(Java 2 Enterprise Edition,Java 2 平台的企业版),应用于基于 Java 的应用服务器。Java 2 平台的发布,是 Java 发展过程中最重要的一个里程碑,标志着 Java 的应用开始普及。

2000年5月8日,JDK 1.3 发布。

2000年5月29日,JDK 1.4 发布。

2001年6月5日,NOKIA宣布,到2003年将出售1亿部支持Java的手机。

2001年9月24日,J2EE1.3 发布。

2002年2月26日,J2SE1.4 发布。自此 Java 的计算能力有了大幅提升,与 J2SE1.3 相比,其多了近62%的类和接口。在这些新特性当中,还提供了广泛的 XML 支持、安全套接字(Socket)支持(通过SSL与TLS协议)、全新的 I/OAPI 、正则表达式、日志与断言。

2004年9月30日,J2SE1.5 发布,成为 Java 语言发展史上的又一里程碑。为了表示该版本的重要性,J2SE 1.5 更名为 Java SE 5.0(内部版本号1.5.0),代号为 “Tiger”,Tiger 包含了从1996年发布1.0版本以来的最重大的更新,其中包括泛型支持、基本类型的自动装箱、改进的循环、枚举类型、格式化 I/O 及可变参数。

2005年发布J2SE 6并更名为 Java SE 6(全平台更名移除'2')

2005年6月,JavaOne 大会召开,Sun 公司公开 Java SE 6。此时,Java 的各种版本已经更名,以取消其中的数字“2”:J2EE 更名为 Java EE,J2SE 更名为 Java SE,J2ME 更名为 Java ME。

2006年 Sun 宣布 Java 基于 GPL 开源

2006年11月13日,Sun 公司宣布 Java 全线采纳 GNU General Public License Version 2,将 Java 技术作为免费软件对外发布,从而正式公开了Java 平台标准版的第一批源代码,以及 Java 迷你版的可执行源代码。

2006年12月11日,Sun把原本的名称“ J2SE ”改为“ Java SE ”,然后再从版本号中去掉“.0”,而开发者内部编号仍然是1.6.0。这个版本是根据 JSR 270 开发的。在发展阶段,新版本大概每周都发布包括一些功能增强和漏洞的修复。Beta 版本在2006年2月和6月发布,也就是为什么2006年12月11日变成最终的版本。

2006年12月23日, Java SE 6 正式发布。

从2007年3月起,全世界所有的开发人员均可对 Java 源代码进行修改。

2009年 Sun 被 Oracle 收购

2009年4月20日,Oracle 公司宣布收购 Sun。

2009年12月,Sun 公司发布Java EE 6。

2010年1月27日,Oracle 公司完成收购 Sun。

2010年4月2日,Java 编程语言的共同创始人之一 James Gosling 从 Oracle 公司辞职。

2010年11月,由于 Oracle 公司对于Java社区的不友善,因此Apache扬言将退出JCP。

2011年7月28日,Oracle 公司举行了全球性的活动,以庆祝 Java7 的推出,随后 Java7 正式发布。

2014年3月 Java8 (特殊的 LTS)发布

2014年3月18日,Oracle 公司发布了 Java SE 8(特殊的 LTS)。

2017年9月 Java9 (non-LTS)发布,并启动新的版本控制和发布节奏模型

2017年9月21日,Oracle 公司发布 Java SE 9(non-LTS),并启动新的版本控制和发布节奏模型。
整体发布节奏为每六个月发布一个新版本,其中每六个月发布一次non-LTS版本,每三年发布一次LTS版本(当二者发布时间冲突时,优先发布LTS版本,non-LTS版本向后推迟一个周期。第一版LTS版本被定为当时还未发布的 Java 11)。
non-LTS版本发布后会得到六个月的商业支持,到期后会被新发布版本取代;LTS版本发布后会得到至少八年的商业支持(根据市场需要有可能会延长),到期后会被新的LTS版本取代。

2018年3月20日,Oracle 公司发布 Java SE 10(non-LTS)。

2018年9月 Java11 (LTS)发布

2018年9月25日,Oracle 公司发布 Java SE 11(LTS)。

引入ZGC:可扩展的低延迟垃圾收集器(实验性)

先前版本中的许多功能已被删除,特别是 Java appletsJava Web Start 不再可用,JavaFXJava EECORBA 模块已从 JDK 中删除。

2019年3月19日,Oracle 公司发布 Java SE 12(non-LTS)。

2019年9月17日,Oracle 公司发布 Java SE 13(non-LTS)。

2020年3月17日,Oralce 公司发布 Java SE 14(non-LTS)。

2020年9月15日,Oracle 公司发布 Java SE 15(non-LTS)。

2021年3月16日,Oracle 公司发布 Java SE 16(non-LTS)。

3.Java语言

Java 是一种广泛使用的计算机编程语言,拥有跨平台面向对象泛型编程的特性,广泛应用于企业级Web应用开发和移动应用开发

Java 语言作为静态面向对象编程语言的代表,极好地实现了面向对象理论,允许程序员以优雅的思维方式进行复杂的编程。

Java 语言是一种分布式的面向对象语言,具有面向对象、平台无关性、简单性、解释执行、多线程、安全性等很多特点。

简单性

Java 看起来设计得很像 C++,但是为了使语言小和容易熟悉,设计者们把 C++ 语言中许多可用的特征去掉了,这些特征是一般程序员很少使用的。例如,Java 不支持 go to 语句,代之以提供 breakcontinue 语句以及异常处理。Java 还剔除了 C++ 的操作符过载(overload)和多继承特征,并且不使用主文件,免去了预处理程序。因为 Java 没有结构,数组和串都是对象,所以不需要指针。Java 能够自动处理对象的引用和间接引用,实现自动的无用单元收集,使用户不必为存储管理问题烦恼,能更多的时间和精力花在研发上。

面向对象

Java 是一个面向对象的语言。对程序员来说,这意味着要注意应中的数据和操纵数据的方法(method),而不是严格地用过程来思考。在一个面向对象的系统中,类(class)是数据和操作数据的方法的集合。数据和方法一起描述对象(object)的状态和行为。每一对象是其状态和行为的封装。类是按一定体系和层次安排的,使得子类可以从超类继承行为。在这个类层次体系中有一个根类,它是具有一般行为的类。Java 程序是用类来组织的。

Java 还包括一个类的扩展集合,分别组成各种程序包(Package),用户可以在自己的程序中使用。例如,Java 提供产生图形用户接口部件的类(java.awt 包),这里 awt 是抽象窗口工具集(abstract windowing toolkit)的缩写,处理输入输出的类(java.io 包)和支持网络功能的类(java.net 包)。

分布性

Java 设计成支持在网络上应用,它是分布式语言。Java 既支持各种层次的网络连接,又以 Socket 类支持可靠的流(stream)网络连接,所以用户可以产生分布式的客户机和服务器。
网络变成软件应用的分布运载工具。Java 程序只要编写一次,就可到处运行。

编译和解释性

Java 编译程序生成字节码(byte-code),而不是通常的机器码。Java 字节码提供对体系结构中性的目标文件格式,代码设计成可有效地传送程序到多个平台。Java 程序可以在任何实现了 Java 解释程序和运行系统(run-time system)的系统上运行。

在一个解释性的环境中,程序开发的标准“链接”阶段大大消失了。如果说 Java 还有一个链接阶段,它只是把新类装进环境的过程,它是增量式的、轻量级的过程。因此,Java 支持快速原型和容易试验,它将导致快速程序开发。这是一个与传统的、耗时的“编译、链接和测试”形成鲜明对比的精巧的开发过程。

稳健性

Java 原来是用作编写消费类家用电子产品软件的语言,所以它是被设计成写高可靠和稳健软件的。Java 消除了某些编程错误,使得用它写可靠软件相当容易。
Java 是一个强类型语言,它允许扩展编译时检查潜在类型不匹配问题的功能。Java 要求显式的方法声明,它不支持 C 风格的隐式声明。这些严格的要求保证编译程序能捕捉调用错误,这就导致更可靠的程序。

可靠性方面最重要的增强之一是 Java 的存储模型。Java 不支持指针,它消除重写存储和讹误数据的可能性。类似地,Java 自动的“无用单元收集”预防存储漏泄和其它有关动态存储分配和解除分配的有害错误。Java 解释程序也执行许多运行时的检查,诸如验证所有数组和串访问是否在界限之内。

异常处理是 Java 中使得程序更稳健的另一个特征。异常是某种类似于错误的异常条件出现的信号。使用 try/catch/finally 语句,程序员可以找到出错的处理代码,这就简化了出错处理和恢复的任务。

安全性

Java 的存储分配模型是它防御恶意代码的主要方法之一。Java 没有指针,所以程序员不能得到隐蔽起来的内幕和伪造指针去指向存储器。更重要的是,Java 编译程序不处理存储安排决策,所以程序员不能通过查看声明去猜测类的实际存储安排。编译的 Java 代码中的存储引用在运行时由 Java 解释程序决定实际存储地址。

Java 运行系统使用字节码验证过程来保证装载到网络上的代码不违背任何 Java 语言限制。这个安全机制部分包括类如何从网上装载。例如,装载的类是放在分开的名字空间而不是局部类,预防恶意的小应用程序用它自己的版本来代替标准 Java 类。

可移植性

Java 使得语言声明不依赖于实现的方面。例如,Java 显式说明每个基本数据类型的大小和它的运算行为(这些数据类型由 Java 语法描述)。

Java 环境本身对新的硬件平台和操作系统是可移植的。Java 编译程序也用 Java 编写,而 Java 运行系统用 ANSIC 语言编写。

高性能

Java 是一种先编译后解释的语言,所以它不如全编译性语言快。但是有些情况下性能是很要紧的,为了支持这些情况,Java 设计者制作了“及时”编译程序,它能在运行时把 Java 字节码翻译成特定 CPU (中央处理器)的机器代码,也就是实现全编译了。

Java 字节码格式设计时考虑到这些“及时”编译程序的需要,所以生成机器代码的过程相当简单,它能产生相当好的代码。

多线程性

Java 是多线程语言,它提供支持多线程的执行(也称为轻便过程),能处理不同任务,使具有线索的程序设计很容易。Java 的 lang 包提供一个 Thread 类,它支持开始线索、运行线索、停止线索和检查线索状态的方法。

Java 的线索支持也包括一组同步原语。这些原语是基于监督程序和条件变量风范,由 C.A.R.Haore 开发的广泛使用的同步化方案。用关键词 synchronized,程序员可以说明某些方法在一个类中不能并发地运行。这些方法在监督程序控制之下,确保变量维持在一个一致的状态。

跨平台性

跨平台性是 Java 主要的特性之一,跨平台使得用 Java 语言编写的程序可以在编译后不用经过任何更改,就能在任何硬件设备条件下运行。这个特性经常被称为“一次编译,到处运行”。

实现跨平台性的方法是大多数编译器在进行 Java 语言程序的编码时候会生成一个用字节码写成的“半成品”,这个“半成品”会在 Java 虚拟机(解释层)的帮助下运行,虚拟机会把它转换成当前所处硬件平台的原始代码。之后,Java 虚拟机会打开标准库,进行数据(图片、线程和网络)的访问工作。主要注意的是,尽管已经存在一个进行代码翻译的解释层,有些时候 Java 的字节码代码还是会被 JIT 编译器进行二次编译。

有些编译器,比如 GCJ,可以自动生成原始代码而不需要解释层。但是这些编译器所生成的代码只能应用于特定平台。并且 GCJ 目前只支持部分的 Java API。

Java 语言使用解释层最初是为了轻巧性。所以这些程序的运行效率比 C 语言和 C++ 要低很多,用户也对此颇有微词。很多最近的调查显示 Java 的程序运行速度比几年前要高出许多,有些同样功能的程序的效率甚至超过了 C++ 和 C 语言编写的程序。

Java 语言在最开始应用的时候是没有解释层的,所有需要编译的代码都直接转换成机器的原始代码。这样做虽然使程序获得了最佳的性能,但是导致程序异常臃肿。从 JIT 技术开始,Java 的程序都经过一次转换之后才变成机器码。很多老牌的第三方虚拟机都使用一种叫做“动态编译”的技术,也就是说虚拟机实时监测和分析程序的运行行为,同时选择性地对程序所需要的部分进行编译和优化。所有这些技术都改善了代码的运行速度,但是又不会让程序的体积变得失常。

程序的轻便性事实上是软件编写很难达到的一个目标,Java 虽然成功地实现了“一次编译,到处运行”,但是由于平台和平台之间的差异,所编写的程序在转换代码的时候难免会出现微小的、不可察觉的错误和意外。有些程序员对此非常头疼,他们嘲笑 Java 的程序不是“一次编译,到处运行”,而是“一次编译,到处调试”。以 Java AWT 为例,早期 Java AWT 内提供的按钮、文字区等均是以计算机系统所默认的样式而显示。这令 Java 程序在有些没有提供图案的计算机系统产生错误(在 Microsoft Windows 设有窗口管理器,在一些 Linux distribution 则没有)。后来 Sun 公司针对 Java AWT 一些问题而推出 Java Swing。

平台无关性让 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++ 的章节。

4.Java平台

Java 平台Java 虚拟机(Java Virtual Machine,JVM)Java 应用编程接口(Application Programming Interface,API) 构成。

Java 应用编程接口为此提供了一个独立于操作系统的标准接口,可分为基本部分和扩展部分。在硬件或操作系统平台上安装一个 Java 平台之后,Java 应用程序就可运行。

Java三大体系

按应用范围,Java 可分为 3 个体系,即 Java SE、Java EE 和 Java ME。

Java SE

Java SE(Java Platform Standard Edition,Java 平台标准版)以前称为 J2SE,它允许开发和部署在桌面、服务器、嵌入式环境和实时环境中使用的 Java 应用程序。Java SE 包含了支持 Java Web 服务开发的类,并为 Java EE 提供基础,如 Java 语言基础、JDBC 操作、I/O 操作、网络通信以及多线程等技术。

Java EE

Java EE(Java Platform Enterprise Edition,Java 平台企业版)以前称为 J2EE。企业版本帮助开发和部署可移植、健壮、可伸缩且安全的服务器端 Java 应用程序。Java EE 是在 Java SE 基础上构建的,它提供 Web 服务、组件模型、管理和通信 API,可以用来实现企业级的面向服务体系结构(Service Oriented Architecture,SOA)和 Web 2.0 应用程序。

Java ME

Java ME(Java Platform Micro Edition,Java 平台微型版)以前称为 J2ME,也叫 K-JAVA。 Java ME 为在移动设备和嵌入式设备(比如手机、PDA、电视机顶盒和打印机)上运行的应用程序提供一个健壮且灵活的环境。

Java ME 包括灵活的用户界面、健壮的安全模型、丰富的内置网络协议以及对可以动态下载的联网和离线应用程序。基于 Java ME 规范的应用程序 只需编写一次就可以用于许多设备,而且可以利用每个设备的本机功能。

5.JDK 与 JRE

JDK(Java Development Kit)

JDK(Java Development Kit)称为 Java 开发工具包,它构成了软件开发工具包(SDK)的扩展子集。它包括“用于开发,调试和监视 Java 应用程序的工具”。由于 JDK 与“常规” JRE 分离并且具有额外的内容,因此它还带有一个完整的 Java Runtime Environment(JRE)。它由 Java 虚拟机和生产环境中存在的所有类库以及仅对开发人员有用的其他库(例如 internationalization 库和 IDL 库)组成。

主流的 JDK 是 Sun(Oracle)公司发布的 JDK ,除了 Sun 之外,还有很多公司和组织都开发了自己的开源JDK(基于OpenJDK Project),例如,IBM 公司开发的 JDK,Amazon 公司的 Amazon Corretto,还有 Alibaba 公司开发的Alibaba Dragonwell,Red Hat 公司开发的 Red Hat build of OpenJDK, London Java Community 开发的AdoptOpenJDK。

想要开发一个全新的Java程序,那么必须安装 JDK。

JDK 主要编程工具

JDK具有一组主要的编程工具,其中包括:
appletviewer – 此工具可用于在没有Web浏览器的情况下运行和调试Java applet。

apt – 注释处理工具。

extcheck – 一种检测JAR文件冲突的实用程序。

idlj – IDL到Java的编译器。该实用程序从给定的Java IDL文件生成Java绑定。

jabswitch – Java访问桥。在Microsoft Windows系统上公开辅助技术。

java – Java应用程序的加载器。该工具是一个解释器,可以解释javac编译器生成的字节码文件。现在,单个启动器用于开发和部署。旧的部署启动器jre不再与Sun JDK一起提供,而是由新的Java加载器代替。

javac – Java编译器,它将源代码转换为Java字节码。

javadoc – 文档生成器,可从源代码注释自动生成文档。

jar – 归档程序,它将相关的类库打包到一个JAR文件中。该工具还有助于管理JAR文件。

javafxpackager – 打包和签名JavaFX应用程序的工具。

jarsigner – jar签名和验证工具。

javah – C头和存根生成器,用于编写本机方法。

javap – 字节码文件反汇编程序。

javaws – JNLP应用程序的Java Web Start启动器。

JConsole – Java监视和管理控制台。

jdb – Java 调试器(debugger)。

jhat – Java堆分析工具(实验性)。

jinfo – 该实用程序从正在运行的Java进程或崩溃转储获取配置信息。(实验性)

jmap Oracle jmap - 内存映射–该实用程序输出Java的内存映射,并且可以打印给定进程或核心转储的共享对象内存映射或堆内存详细信息。(实验性)

jmc – Java任务控制。

jpackage –用于生成自包含应用程序捆绑包的工具。(实验性)

jps – Java虚拟机进程状态工具列出了目标系统上已检测到的Hotspot Java虚拟机(JVM)。(实验性)

jrunscript – Java命令行脚本 外壳。

jshell - Java 9中引入的新jshell。

jstack – 打印Java线程的Java堆栈跟踪的实用程序。(实验性)

jstat – Java虚拟机统计信息监视工具。(实验性)

jstatd – jstat守护程序。(实验性)

keytool – 用于操作密钥库的工具。

pack200 – JAR压缩工具。

policytool – 策略创建和管理工具,可以确定Java运行时的策略,并指定可用于各种来源的代码的权限。

VisualVM – 集成了几个命令行JDK工具和轻量级[需要澄清]性能和内存配置功能的可视化工具。

wsimport – 生成用于调用Web服务的可移植JAX-WS工件。

xjc – XML绑定Java API(JAXB)API的一部分。它接受XML模式并生成Java类。

JRE(Java Runtime Environment)

JRE 是 Java Runtime Environment(Java 运行时环境),由 Sun Microsystems 研发,JRE 可以让电脑系统运行 Java 应用程序(Java Application)。

JRE 的内部有一个 Java 虚拟机(Java Virtual Machine,JVM)以及一些标准的类别函数库(Class Library)。

想要运行一个已有的 Java 程序,就只需要安装 JRE 即可。

6.简易的Java程序

源文件名为:HelloWorld.java
文件内容为:

/*
 *访问修饰符:public---公开访问
 *class---类标识符
 *类名:HelloWorld(可以随意写)
 */
public class HelloWorld {
    /*
     *访问修饰符:public---公开访问
     *static---静态修饰符
     *返回类型:void---空返回类型
     *方法名:main---方法名(main方法名不可乱写,其他方法可以随意写)
     *形式参数类型:String[]---字符串数组类型
     *形式参数名:args---变量名(可以随意写)
     */
    public static void main(String[] args) {
        //将"HelloWorld"输出打印到控制台
        System.out.println("HelloWorld");
    }
}

PS:
大小写敏感:Java是大小写敏感的,这就意味着标识符Hello与hello是不同的。

源文件名:源文件名必须和主类名(public 后面的类名)相同。当保存文件的时候,你应该使用主类名作为文件名保存(切记Java是大小写敏感的),文件名的后缀为.java。(如果文件名和主类名不相同则会导致编译错误)。

主方法入口:所有的Java程序由public static void main(String[] args)方法开始执行。

类名(大驼峰命名法):对于所有的类来说,类名的首字母应该大写。如果类名由若干单词组成,那么每个单词的首字母应该大写,例如MyFirstJavaClass。

方法名(小驼峰命名法):所有的方法名都应该以小写字母开头。如果方法名含有若干单词,则后面的每个单词首字母大写,例如myFirstJavaMethod。

可以使用txt文件,编写文件内容后,再对文件进行重命名操作,从而完成编写Java源文件。

7.Java程序的简易理论运作流程

1.编写Java源文件

编写 Java 源文件(即: *.java 文件,文本文件)。

2.编译Java源文件为字节码文件

使用编译器 javac.exe 将 Java 源文件编译生成一种与平台无关的二进制中间码---字节码文件(即: *.class 文件,特殊的二进制文件(可以理解为 JVM 专用的机器语言))。

3.JVM解释字节码文件并运行

Java 虚拟机(即 JVM ) 加载字节码文件,调用解释器 java.exe 将字节码文件解释为当前平台的机器语言并运行。

PS:Class 文件是16进制的一组以8位字节为基础单位的二进制流,各个数据项目严格按照顺序紧凑地排列在 Class 文件之中,中间没有添加任何分隔符,这使得整个 Class 文件中存储的内容几乎全部是程序运行的必要数据,没有空隙存在。当遇到需要占用8位字节以上空间的数据项时,则会按照高位在前的方式分割成若干个8位字节进行存储。

8.集成开发环境工具

IntelliJ IDEA

IntelliJ IDEA:IntelliJ 在业界被公认为最好的 Java 开发工具,尤其在智能代码助手、代码自动提示、重构、JavaEE 支持、各类版本工具( git、svn 等)、JUnit、CVS 整合、代码分析、 创新的 GUI 设计等方面的功能可以说是超常的,支持 HTML,CSS,PHP,MySQL,Python,Kotlin 等。

Eclipse

Eclipse:Eclipse 是著名的跨平台的自由集成开发环境(IDE)。最初主要用来 Java 语言开发,但是目前亦有人通过插件使其作为其他计算机语言比如 C++ 和 Python 的开发工具。

NetBeans

NetBeans:NetBeans 是 Sun 公司在2000年创立的开放源代码供开发人员和客户社区的家园,旨在构建世界级的 Java IDE。NetBeans 当前可以在 Solaris、Windows、Linux和 Macintosh OS X 平台上进行开发,并在 SPL (Sun 公用许可)范围内使用。
NetBeans 包括开源的开发环境和应用平台,NetBeans IDE 可以使开发人员利用 Java 平台能够快速创建 Web、企业、桌面以及移动的应用程序,NetBeans IDE 已经支持 PHP、Ruby、JavaScript、Groovy、Grails 和 C/C++ 等开发语言。

MyEclipse

MyEclipse:由 Genuitec 公司开发的一款商业化软件,是在 Eclipse 基础上加上自己的插件开发而成的功能强大的企业级集成开发环境,主要用于 Java、Java EE 以及移动应用的开发。在最新版本的 MyEclipse 中,配合 CodeMix 使用支持也十分广泛,尤其是对各种开源产品和主流开发框架的支持相当不错。目前已支持 PHP、Python、Vue、Angular、React、Java、Java EE 等语言和框架开发。

9.参考资料(排名不分先后)

维基百科-Java
百度百科-Java
C语言中文网-Java教程
菜鸟教程-Java
Oracle战略收购Sun声明
维基百科-Java版本历史
OpenJDK-JEP 333: ZGC: A Scalable Low-Latency Garbage Collector (Experimental)
维基百科-Java applets
百度百科-JavaApplet
维基百科-Java Web Start
百度百科-Java Web Start
维基百科-JavaFX
百度百科-JavaFX
维基百科-Java EE
百度百科-Java EE
维基百科-CORBA
百度百科-CORBA
Donald Smith-Oracle JDK Releases for Java 11 and Later
Oracle Blogs-Donald Smith
Donald Smith-Update and FAQ on the Java SE Release Cadence
Oracle-Oracle Java SE Support Roadmap
维基百科-Java Development Kit
维基百科-JRE
博客园-某人的喵星人-Java程序运行流程
百度百科-二进制文件
百度百科-文本文件
《深入理解Java虚拟机(第三版)》-周志明-Class类文件的结构
百度百科-IntelliJ IDEA
百度百科-Eclipse
百度百科-NetBeans
百度百科-MyEclipse

posted on 2020-12-02 17:59  HeavenZhi  阅读(387)  评论(0编辑  收藏  举报

导航