Java语言简史:
是SUN
(Stanford University Network,斯坦福大学网络公司 ) 1995年
推出的一门高级编程语言。
是一种面向Internet的编程语言。Java一开始富有吸引力是因为Java程序可以在Web浏览器
中运行。这些Java程序被称为Java小程序
(applet),内嵌在HTML代码中。
发行版本 | 发行时间 | 备注 |
---|---|---|
Java 1.0 | 1996.01.23 | Sun公司发布了Java的第一个开发工具包 |
Java 1.1 | 1997.02.19 | JavaOne会议召开,创当时全球同类会议规模之最。 |
Java 1.2 | 1998.12.08 | Java拆分成:J2SE(标准版)、J2EE(企业版)、J2ME(小型版) |
Java 1.3 | 2000.05.08 | |
Java1.4 | 2004.02.06 | |
Java 5.0 | 2004.09.30 | ①版本号从1.4直接更新至5.0;②平台更名为JavaSE、JavaEE、JavaME |
Java 6.0 | 2006.12.11 | 2009.04.20 Oracle宣布收购SUN公司 |
2009.04.20 | Oracle公司收购SUN,交易价格74亿 美元。 | |
Java 7.0 | 2011.07.02 | |
Java 8.0 | 2014.03.18 | 此版本是继Java 5.0以来变化最大的版本。是长期支持版本(LTS) |
Java 9.0 | 2017.09.22 | ①此版本开始,每半年更新一次;②Java 9.0开始不再支持windows 32位系统 |
Java 10.0 | 2018.03.21 | |
Java 11.0 | 2018.09.25 | JDK安装包取消独立JRE安装包,是长期支持版本(LTS) |
Java 12.0 | 2019.03.19 | |
... | ... | |
Java17.0 | 2021.09 | 发布Java 17.0,版本号也称为21.9,是长期支持版本。 |
... | ... | |
Java19.0 | 2022.09 | 发布Java19.0,版本号也称为22.9。 |
Java技术体系平台:
Java的应用场景:JavaEE后台开发、Android客户端的开发、大数据的开发、游戏领域、桌面应用、嵌入式领域等开发。
Java SE(Java Standard Edition)标准版 | 支持面向 包括用户界面接口AWT及Swing,网络功能与国际化、图像处理能力以及输入输出支持等。 | |
---|---|---|
Java EE(Java Enterprise Edition)企业版 | 为开发企业环境下的应用程序提供的一套解决方案,即定位 JavaEE是JavaSE的扩展,增加了用于服务器开发的类库。如:Servlet能够延伸服务器的功能,通过请求-响应的模式来处理客户端的请求;JSP是一种可以将Java程序代码内嵌在网页内的技术。 | |
Java ME(Java Micro Edition)小型版 | 支持Java程序运行在 JavaME是JavaSE的内伸,精简了JavaSE 的核心类库,同时也提供自己的扩展类。增加了适合微小装置的类库:javax.microedition.io.*等。 |
Java语言的特性:
是简单的 | Java 继承了C和C++、所以语法与他们很接近,但是Java 丢弃了 C++ 中很少使用的、很难理解的、令人迷惑的特性,如操作符重载、多继承、自动的强制类型转换等。Java 语言不使用指针,而是引用。并提供了内存空间自动分配和回收,使得程序员不必为内存管理而担忧。 |
---|---|
是面向对象的 | Java 提供类、接口和继承等面向对象的特性,只支持类之间的单继承,但支持接口之间的多继承,并支持类与接口之间的实现机制(关键字为implements)。 Java 语言全面支持动态绑定,而 C++语言只对虚函数使用动态绑定。 |
是分布式的 | Java 支持网络应用的开发,在基本的 Java 应用编程接口中有一个网络应用编程接口(java net),它提供了用于网络应用编程的类库,包括 URL、URLConnection、Socket、ServerSocket 等。 Java 的 RMI(远程方法激活)机制也是开发分布式应用的重要手段。 |
是健壮的 | Java 的强类型机制、异常处理、垃圾自动回收机制等是 Java 程序健壮性的重要保证。 Java 的安全检查机制使得 Java 更具健壮性。 |
是安全的 | Java通常被用在网络环境中,为此,Java 提供了一个安全机制使对通过网络下载的类具有一个安全防范机制(类 ClassLoader)以防恶意代码的攻击;如分配不同的命名空间以防替代本地的同名类、字节代码检查,并提供安全管理机制(类 SecurityManager)让 Java 应用设置安全哨兵。 |
是体系结构中立的 | Java 程序(.Java文件)在 Java 平台上被编译为体系结构中立的字节码格式(class 文件),然后可以在实现在这个 Java 平台的任何系统中运行。这种途径适合于异构的网络环境和软件的分发。 |
是可移植的 | 可移植性来源于体系结构中立性。 Java 系统本身也具有很强的可移植性,Java 编译器是用 Java 实现的,Java 的运行环境是用 ANSI C 实现的。 |
是解释型的 | Java 程序在 Java 平台上被编译为字节码格式,然后可以在实现这个 Java 平台的任何系统中运行。在运行时,Java 平台中的 Java 解释器对这些字节码进行解释执行,执行过程中需要的类在联接阶段被载入到运行环境中。 |
是高性能的 | Java与那些解释型的高级脚本语言相比,Java 的确是高性能的。事实上,Java 的运行速度随着 JIT(Just-In-Time)编译器技术的发展越来越接近于 C++。 |
是多线程的 | 在 Java 中,线程是一种特殊的对象,它必须由 Thread 类或其子(孙)类来创建。通常有两种方法来创建线程: 其一,使用型构为 Thread(Runnable) 的构造子类将一个实现了Runnable 接口的对象包装成一个线程; 其二,从 Thread 类派生出子类并重写 run 方法,使用该子类创建的对象即为线程。 值得注意的是 Thread 类已经实现了 Runnable 接口,因此,任何一个线程均有它的 run 方法,而 run 方法中包含了线程所要运行的代码。线程的活动由一组方法来控制。Java 语言支持多个线程的同时执行,并提供多线程之间的同步机制(synchronized)。 |
是动态的 | Java 语言的设计目标之一是适应于动态变化的环境。Java 程序需要的类能够动态地被载入到运行环境,也可以通过网络来载入所需要的类。这也有利于软件的升级。另外,Java 中的类有一个运行时刻的表示,能进行运行时刻的类型检查。 |
是跨平台的 | 通过Java语言编写的应用程序在不同的系统平台上都可以运行、只需要运行java 应用程序的操作系统上,先安装一个Java虚拟机(JVM Java Virtual Machine) 即可。由JVM来负责Java程序在该系统中的运行。 |
JDK、JRE、Jvm:
JDK | JRE + 开发工具集(例如Javac编译工具等) | 是Java程序开发工具包,包含 安装了JDK,就不用在单独安装JRE了。但是开发中一些软件可以还是需要独立的jre。 | |
---|---|---|---|
JRE | JVM + Java SE标准类库 | 是Java程序的运行时环境,包含 如果想要运行一个开发好的Java程序,计算机中只需要安装JRE即可。 |
Java工具集:
命令 | 说明 | |
---|---|---|
java -version | 展示jdk、jre和jvm的版本号 | |
javac | 编译java文件并生成同类名的可供JVM解析的`.class`文件 编译时需要带上后缀。 文件名无所谓大小写,因为现在是在window系统下找文件,window不区分大写。 | |
java | 执行 .class文件此时不用带后缀且文件名区分大小写,因为class文件是Java生成的,Java区分大小写。如果要单文件运行Java文件,那么Java文件需要有main方法(程序的入口)否则不能执行。 | |
执行jar包文件 | ||
jar | 主要用于打包jar文件 | |
javadoc | 主要用于生成帮助文档。 | |
某命令 -help | 获取某个Java命令的解释说明. |
Java开发环境:
下载JDK:
下载地址:Java Downloads | Oracle,点击如下下载按钮:
在下载页面中你需要选择接受许可,并根据自己的系统选择对应的版本,本文以 Window 64位系统为例:
安装JDK:
双击下载的jdk-8u131-windows-x64.exe进入安装向导。
下一步,可以更改安装路径(但安装路径不要有中文或者空格等特殊符号)
下一步,开始安装
Jdk目录说明:
bin目录 | 开发工具集 | |
---|---|---|
db目录 | 该目录是一个小型数据库,在Java中引入了一个开源的数据库管理系统——JavaDB。因此在学习JDBC时无需安装额外的数据库软件,直接使用JavaDB即可。 | |
jre目录 | 该目录为Java运行时的环境根目录,它包含Java虚拟机、运行时的类包、Java应用启动器和一个bin目录,但不包含开发环境中的开发工具 | |
include目录 | 存放开放JDK所使用的c语言的头文件 | |
lib目录 | Java类库或库文件,是开发工具使用的归档包文件 | |
src.zip文件与javafx-src.zip文件 | 存放JDK核心类源代码和JavaFX源代码,通过这两个文件可以查看Java基础类的源代码 |
安装JRE:
jdk安装后已包含jre、但会提示安装jre(安装路径不要有中文或者空格等特殊符号),是因为开发软件(如:idea、eclipse)需要一个独立jre
点击下一步,开始安装
结束安装
配置环境变量:
安装完成后,右击"我的电脑",点击"属性",选择"高级系统设置";
选择"高级"选项卡,点击"环境变量";
然后就会出现如下图所示的画面:
在 "系统变量" 中设置 JAVA_HOME、PATH、CLASSPATH属性,若已存在则点击"编辑",不存在则点击"新建"。
系统变量和用户变量的区别:
推荐系统变量不管那个用户登录都可使用,用户变量当换其他用户登录时会使用不了其他用户配置的变量。
JAVA_HOME 设置
此配置在运行tomcat时,tomcat会去根据此名找寻安装的JDK
JAVA_HOME | C:\Program Files (x86)\Java\jdk1.8.0_91 | 要根据自己的jdk实际路径配置 |
---|
PATH设置
Path | %JAVA_HOME%\bin;%JAVA_HOME%\jre\bin; | 双%号代表取属性名的值 |
---|
path环境变量是windows系统执行命令时要搜寻的路径。多个变量用';'分号隔开
当执行的命令在当前目录下如果不存在,windows会在path变量指定的目录中查找。如果仍未找到,会出现错误提示。为了所有地方都能使用java命令所以需要配置此变量,否则的话只有进入到 jdk安装路径的bin目录下才能执行命令。
Jdk可以安装多个,但是只有你配置了环境变量才会真正使用,jdk配置那个使用的是哪个,同时最好把jdk的信息放最上面
Windows10:
Path 变量里是分条显示的,需分开添加,且移到最上面否则无法识别
jdk17:
jdk17在安装后会自动进行path变量的配置,但我们要改成JAVA_HOME+path配置方式;如下为自动配置。
classPath:
CLASSPATH | .;%JAVA_HOME%\lib\dt.jar;%JAVA_HOME%\lib\tools.jar; | 记得前面有个"." 运行时去找class文件的地方,如果使用 1.5 以上版本的 JDK,不用设置 CLASSPATH 环境变量,也可以正常编译和运行 Java 程序。 |
---|
测试JDK是否安装配置成功:
打开dos命令窗口键入命令: java -version命令,出现版本信息,说明环境变量配置成功;
Java程序:
文件格式是 .Java,源文件的基本组成部分是类(class), 一个源文件中可以包含多个类(非内部类)并且编译后也会生成多个字节码文件。但最多只能有一个public类,且源文件名必须与pbulic类的类名相同,类名首字母应该大写,否则编译失败(非public的类源文件名可以不跟类名一致)。
每一行执行语句必须以;结束
Java中都是纯英文字符的且严格区分大小写,不能用中文符号,英文半角的标点符号(正确) ,括号都是成对出现的。
Java开发流程:
编写 | 将 Java 代码编写到扩展名为 .java 的源文件中 | ||
---|---|---|---|
编译 | javac Java源文件名.后缀名java | 通过 javac.exe 命令对该 java 文件进行编译,生成一个或多个字节码文件(.class) | |
运行 | java 主类名字(字节码文件名) | 通过 java.exe 命令对生成的 class 文件进行解释运行 | |
注意:每改变一次Java源文件都需要重新编译,才能运行到修改后的内容。 |
类的格式:
// class:关键字,表示"类",后面跟着类名
public class 类名(大驼峰){
方法{
语句;
}
}
main方法:
main方法格式是固定的,如果运行类时没有此方法会报在类中找不到主方法。
因为main() 方法是静态的,我们不能直接访问该类中的非静态成员,必须创建该类的一个实例对象后,才能通过这个对象去访问类中的非静态成员。
public static void main(String[] args){ }
public | 公共的,用它修饰的类或成员在任意位置可见,由于Java虚拟机需要调用类的main()方法,所以该方法的访问权限必须是public |
---|---|
static | 静态的,用它修饰的方法,可以不用创建对象就可以调用,因为Java虚拟机在执行main()方法时不必创建对象,所以该方法必须是static的 |
void | 表示该方法没有返回值 |
main | Java的主方法名,JavaSE的程序入口 |
String[] args | 字符串数组,这是main方法的形参类型,可以通过命令行参数传值、接收一个String类型的数组参数,该数组中保存执行Java命令时传递给所运行的类的参数。 args这是main方法的形参名,如果要在main中使用命令行参数,可以遍历该args数组。 |
main方法传参:
public class CommandLine {
public static void main(String[] args){
for(int i=0; i<args.length; i++){
System.out.println("args[" + i + "]: " + args[i]);
}
}
}
$ javac CommandLine.java
$ java CommandLine this is a command line 200 -100
// 各个参数
args[0]: this
args[1]: is
args[2]: a
输出语句:
输出语句并换行:
可以直接为空使用,代表换行。
System.out.println(“Hello World");
只输出语句:
输出内容,完毕后不做任何处理 ,不能为空使用。为空报错。
System.out.print(“Hello World");
字符编码问题:
当与.java源文件的字符编码不一致时,运行Java文件会乱码。
解决方案一:
在编辑器中,修改源文件的字符编码
解决方式二:
在使用javac命令式,可以指定源文件的字符编码
javac -encoding utf-8 Review01.java
注释:
源文件中用于解释、说明程序的文字就是注释。
提升了程序的可阅读性、单行和多行注释还能调试程序
对于单行和多行注释,被注释的文字,不会不会出现在字节码文件中,进而不会被JVM(java虚拟机)解释执行。
单行注释:
//注释文字
多行注释:
多行注释里面不允许有多行注释嵌套。
/*
注释文字1
注释文字2
注释文字3
*/
文档注释:
文档注释内容可以被JDK提供的工具 javadoc 所解析,生成一套以网页文件形式体现的该程序的说明文档。
每一个类的信息将在独自的HTML文件里。javadoc 也可以输出继承的树形结构和索引
在开始的 /** 之后,第一行或几行是关于类、变量和方法的主要描述。之后,你可以包含一个或多个各种各样的 @ 标签。每一个 @ 标签必须在一个新行的开始或者在一行的开始紧跟星号(*).
多个相同的标签注释要放在一起。
javadoc解析的类都是public的
javadoc 标签
标签 | 描述 | 示例 |
---|---|---|
@author | 标识一个类的作者 | @author description |
@deprecated | 指名一个过期的类或成员 | @deprecated description |
{@docRoot} | 指明当前文档根目录的路径 | Directory Path |
@exception | 标志一个类抛出的异常 | @exception exception-name explanation |
{@inheritDoc} | 从直接父类继承的注释 | Inherits a comment from the immediate surperclass. |
{@link} | 插入一个到另一个主题的链接 | {@link name text} |
{@linkplain} | 插入一个到另一个主题的链接,但是该链接显示纯文本字体 | Inserts an in-line link to another topic. |
@param | 说明一个方法的参数 | @param parameter-name explanation |
@return | 说明返回值类型 | @return explanation |
@see | 指定一个到另一个主题的链接 | @see anchor |
@serial | 说明一个序列化属性 | @serial description |
@serialData | 说明通过writeObject( ) 和 writeExternal( )方法写的数据 | @serialData description |
@serialField | 说明一个ObjectStreamField组件 | @serialField name type description |
@since | 标记当引入一个特定的变化时 | @since release |
@throws | 和 @exception标签一样. | The @throws tag has the same meaning as the @exception tag. |
{@value} | 显示常量的值,该常量必须是static属性。 | Displays the value of a constant, which must be a static field. |
@version | 指定类的版本 | @version info |
编写文件注释:
/**
文档注释演示。这是我的第一个Java程序!^_^
@author songhk
@version 1.0
*/
public class HelloWorld{
/**
Java程序的入口
@param args main方法的命令参数
*/
public static void main(String[] args){
System.out.println("hello");
}
}
操作方式:
javadoc -d 文件夹名 -author -version 类名.java
或
javadoc 类名.java
Jvm:
是一个虚拟的计算机,是Java程序的运行环境。JVM具有指令集并使用不同的存储区域,负责执行指令,管理数据、内存、寄存器。
跨平台性:
我们编写的Java代码,都运行在JVM 之上 ,只要在需要运行 java 应用程序的操作系统上,先安装一个Java虚拟机 (J
VM ,Java V
irtual M
achine) 即可。由JVM来负责Java程序在该系统中的运行。这种机制屏蔽了底层运行平台的差别,实现了“一次编译,到处运行“的跨平台性。
自动内存管理:
内存分配:
Java程序在运行过程中,涉及到运算的数据的分配
、存储
等都由JVM来完成
内存回收(GC):
不再使用的内存空间应回收,忘记或者错误的内存回收会导致程序或系统的不稳定甚至崩溃
垃圾回收机制只回收JVM堆内存里的堆空间。对其他物理连接,比如数据库连接、输入流输出流、Socket连接无能为力需要手动关闭。
可以将对象的引用变量设置为null,暗示垃圾回收机制可以回收该对象。也可以通过System.gc()或者Runtime.getRuntime().gc()来通知系统进行垃圾回收,会有一些效果,但是系统是否进行垃圾回收依然不确定(Java语言规范并不保证GC一定会执行)。 垃圾回收在Java程序运行过程中自动进行具有不可预知性,程序无法精确控制垃圾回收机制执行(Java语言没有提供释放已分配内存的显示操作方法。)。
垃圾回收机制回收任何对象之前,总会先调用它的finalize方法、如果覆盖该方法,让一个新的引用变量重新引用该对象,则会重新激活对象。永远不要主动调用某个对象的finalize方法,应该交给垃圾回收机制调用。
垃圾回收流程:
对于GC来说,当程序员创建对象时,Java就提供一种系统级线程跟踪存储空间的地址、大小以及使用情况。
通常,GC采用有向图的方式记录和管理堆(heap)中的所有对象。通过这种方式确定哪些对象是"可达的",哪些对象是"不可达的(不再使用的内存空间)"。
当GC在JVM空闲时确定一些对象为"不可达(不再使用的内存空间)"时GC就有责任回收这些内存空间,并检查释放那些可被释放的存储空间。
内存泄漏/溢出:
GC的自动回收,提高了内存空间的利用效率,也提高了编程人员的效率,很大程度上减少了
因为没有释放空间而导致的内存泄漏
。但是Java程序还会出现内存泄漏和内存溢出问题.
内存泄露:
是指程序在申请内存后,无法释放已申请的内存空间。
一次内存泄漏似乎不会有大的影响,但内存泄漏堆积后的后果就是内存溢出。
内存溢出:指程序申请内存时,没有足够的内存供申请者使用。