# Java语言发展史

时间 版本
1995年 美国Sun公司(Stanford University Network)在1995年推出的,作者James Gosling
1996年 Java 1.0
1997年 Java 1.1
1998年 Java 1.2
2000年 Java 1.3
2002年 Java 1.4
2004年 Java 5.0(革新)
2006年 Java 6.0
2009年 Oracle甲骨文收购Sun公司
2011年 Java 7.0
2014年 Java 8.0(普及)
2017年9月 Java 9.0
2018年3月 Java 10.0
2018年9月 Java 11.0
2019年3月 Java 12.0
2019年9月 Java 13.0
2020年3月 Java 14.0

# Java版本

Java从9.0以后是6个月迭代,每年的三月和九月发布。除此之外Java 11.0有LTS(长期支持)。

# Java起源

Java最早是SUN公司设计出来的,主要是用于一个叫Green的嵌入式程序,目的是为家电开发一个分布式系统,通过网络对家用电器控制。在Green时,工程师最早想用C++,但是由于该语言的复杂性,开发出了Java,在2009年4月20日被Oracle以74亿美元收购。

Oracle一直以微软为对手,当时它们都致力于企业办公平台的技术支持,一个企业级系统开发核心有4个部分:操作系统,数据库,中间件,编程语言。Oracle收购了Java获得了庞大的开发群体,又收购了BEA,得到了Weblogic中间件,使得Oracle公司具备完善的企业平台支持的能力。

Java是一门综合性的语言,从最初设计就考虑了嵌入式系统以及企业平台的开发支持,它包含三个部分:

  • Java标准开发(Java Platform Standard Edition,Java SE):包含Java语言核心的类,比如数据库连接,接口定义,输入输出,网络编程。
  • Java嵌入式开发(Java Platform Micro Edition,Java ME):包含Java SE的部分类,用于消费类电子产品的软件开发,比如手机,PDA,机顶盒等。
  • Java企业开发(Java Platform Enterprise Edition,Java EE):包含Java SE中的所有类,还包含用于开发企业级应用的类,比如EJB,Servlet,JSP,XML,事务控制等,是大型系统和互联网项目开发的主要平台。

# Java语言特点

  • Java是一种面向对象的语言,克服了C++语言中的所有难以理解和容易混淆的特点,更加严谨也足够简单。
  • 可移植,一次编写,处处运行,它基于JVM,可直接利用JVM的指令集解释程序运行。
  • 垃圾回收,引用传递,多线程支持,模块化支持。
  • 适合分布式计算。

# Java环境配置

# 概念辨析

JDK(Java Development Kit)是Java的开发工具包,它包含JRE和开发工具,JRE(Java Runtime Environment)又包含JVM和核心类库。如果只有JRE,那么它只能保证Java程序的运行,无法进行项目开发。

JDK的目录下的内容:

  • bin:存放JDK的工具命令。
  • conf:存放JDK的相关配置文件。
  • include:存放了一些头文件。
  • jmods:存放JDK的各种模块。
  • legal:存放JDK各模块的授权文档。
  • lib:JDK工具的补充jar包。

# 环境变量

windows下配置:

JAVA_HOME=D:/jdk8
# jdk8
classpath=.;%JAVA_HOME%\lib;%JAVA_HOME%\lib\tools.jar
# 比jdk8更高的版本
classpath=.;%JAVA_HOME%\lib
Path=%JAVA_HOME%\bin
1
2
3
4
5
6

linux下配置

vi /etc/profile

export JAVA_HOME=/usr/java/jdk1.8.0_201  
export JRE_HOME=${JAVA_HOME}/jre  
export CLASSPATH=.:${JAVA_HOME}/lib:${JRE_HOME}/lib  
export PATH=${JAVA_HOME}/bin:$PATH
1
2
3
4
5
6

# 环境配置

我们使用Eclipse作为开发环境,从官网下载该IDE然后安装。该IDE包含以下几部分:

  • JDT(Java Development Tools):专门开发Java SE程序的平台,提供调试,运行,提示等功能。
  • JUnit 单元测试软件。
  • CVS,GIT等版本控制
  • 插件开发。

# Eclipse配置

  1. JDK依赖于JDK的支持,默认会自动选择一个JDK,如果要指定JDK,可在Window->Preference->Java->Installed JREs,选择Standard VM。

    JREChoose

  2. 需要统一指定文件编码,在Window->Preferences->General->Workspace->Text file encoding->Other指定为UTF-8。

  3. 如需第三方jar文件,可以在项目->Properties->Java Build Path->Libraries->Classpath->AddExternalJARs...。如果要导出自己的jar包,可在File->Export->Java->JAR文件。

  4. 我一般安装Darkest Dark Theme with DevStyle和Vrapper(Vim)这两个插件。

  5. 在Window->Preferences->Java->Editor->Content Assist处有Auto activation triggers for Java,可以在.后面填写qwertyuiopasdfghjklzxcvbnm,开启所有字母出发自动补全。

  6. 在Window->Preferences->General->Editors->TextEditors设置Insert spaces for tabs为True。

  7. 如果要更改项目的JDK版本,可项目右键->属性->JavaBuildPath->Libraries->双击JRE System Library。

# Eclipse快捷键

快捷键 作用
Ctrl+1 代码纠正提示
Alt+/ 手动调用代码提示
Ctrl+Shift+下方向键 复制当前行
Ctrl+/ 单行注释
Ctrl+Shift+/ 多行注释
Ctrl+Shift+F 格式化代码
Ctrl+Shift+O 自动导入所需包

# 程序编写

# 开发流程

Java的口号是"write once,run anywhere!",它的开发和C++略有不同,C++是从源程序直接编译出执行程序,而Java要跨平台,它是Java源程序先经过(编译器Javac.exe)编译成Java字节码文件,然后再用(解释程序java.exe)来解释Java字节码文件。

Java程序的执行依赖于JVM,当用户使用Java命令去解释class字节码文件时,实际都会启动一个JVM进程,这个进程需要一个明确的类加载路径,这个路径就是通过CLASSPATH环境变量指定的。

Java程序分为Application和Applet程序,Applet程序主要应用在网页上,现在已经不再使用。

# JSell工具

从JDK 1.9以后提供了一个交互式工具JShell,此程序可以方便的编写程序,输入/open进行文件内容加载,输入/exit会退出交互式环境。

# 程序编写

Java是面向对象的,面向对象中类是基本的单位,需要注意的是:

  • 定义类时如果使用public修饰,那么定义该类的文件名一定要与该类名一致。也就是说在Java中一个文件可以包含多个类,但是文件名需要与public修饰的类一致。
  • 如果某类没有使用public修饰,文件名可以不与该类名一致。当一个文件中有多个类定义时,在编译时,会将编译后的各个class保存到不同的.class文件中。
public class Person{
    public static void main(String[] args){
        System.out.println("hello world");
    }
}

class Student{

}
1
2
3
4
5
6
7
8
9

# 测试

测试分为黑盒测试和白盒测试,黑盒测试是不管内部实现,给一个输入,看输出是否符合预期。白盒测试又称结构测试,透明盒测试,逻辑驱动测试,是一种测试用例设计方法,在不同地方设立检查点,来确定实际运行状态与预期状态是否一致。JUnit是一个回归测试框架(Regression Testing Framework),用于白盒测试。

白盒测试有几个原则:

  1. 一个模块中的所有独立路径至少被测试一次。
  2. 检查程序的内部数据结构,保证结构的有效性。

白盒测试步骤:

  1. 定义测试类。
  2. 定义测试方法,并添加@Test注解。

JUnit中提供了一个TestCase类,有很多assertXXX()方法,使用断言来处理结果。

  1. 判断是否为null,可以使用assertNull(),assertNotNull()。
  2. 判断是否为true,可使用assertTrue(),assertNotFalse()。
  3. 判断是否相等,可使用assertEquals(预期值,实际值)。

有两个特殊注解:

  • @Before : 所注解的方法会在所有测试方法执行之前进行执行。
  • @After : 所注解的方法会在所有测试方法执行之后进行执行。