> 文章列表 > Java概述

Java概述

Java概述

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 SE(Java Standard Edition)标准版

支持面向桌面级应用(如Windows下的应用程序)的Java平台,即定位个人计算机的应用开发。

包括用户界面接口AWT及Swing,网络功能与国际化、图像处理能力以及输入输出支持等。

Java EE(Java Enterprise Edition)企业版

为开发企业环境下的应用程序提供的一套解决方案,即定位在服务器端的Web应用开发

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程序开发工具包,包含JRE 和开发人员使用的工具。
JRE JVM + Java SE标准类库 是Java程序的运行时环境,包含JVM 和运行时所需要的核心类库

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 代码编写到扩展名为 .java 的源文件中
编译 javac Java源文件名.后缀名java 通过 javac.exe 命令对该 java 文件进行编译,生成一个或多个字节码文件(.class)
运行 java 主类名字(字节码文件名) 通过 java.exe 命令对生成的 class 文件进行运行
注意:每改变一次Java源文件都需要重新编译,才能运行到修改后的内容。

类的格式

// class:关键字,表示"类",后面跟着类名
public class 类名(大驼峰){}

main方法:

   main方法格式是固定的如果运行类时没有此方法会报在类中找不到主方法。

   由于Java虚拟机需要调用类的main()方法,所以该方法的访问权限必须是public,又因为Java虚拟机在执行main()方法时不必创建对象,所以该方法必须是static的,该方法接收一个String类型的数组参数,该数组中保存执行Java命令时传递给所运行的类的参数。

   又因为main() 方法是静态的,我们不能直接访问该类中的非静态成员,必须创建该类的一个实例对象后,才能通过这个对象去访问类中的非静态成员。

public static void main(String[] args){ }
public 公共的,用它修饰的类或成员在任意位置可见
static 静态的,用它修饰的方法,可以不用创建对象就可以调用
void 表示该方法没有返回值
main Java的主方法名,JavaSE的程序入口
String[] args 字符串数组,这是main方法的形参类型,可以通过命令行参数传值、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");

字符编码问题:

解决方案一:

   在编辑器中,修改源文件的字符编码

解决方式二:

   在使用javac命令式,可以指定源文件的字符编码

javac -encoding utf-8 Review01.java

注释

   源文件中用于解释、说明程序的文字就是注释、提升了程序的可阅读性.

   注释还能调试程序

   对于单行和多行注释,被注释的文字,不会不会出现在字节码文件中,进而不会被JVM(java虚拟机)解释执行。

单行注释:

//注释文字

多行注释:

   多行注释里面不允许有多行注释嵌套。

/* 
注释文字1 
注释文字2
注释文字3
*/

文档注释:

   文档注释内容可以被JDK提供的工具 javadoc 所解析,生成一套以网页文件形式体现的该程序的说明文档。

/@author  指定java程序的作者@version  指定源文件的版本
*/ 

执行命令:

javadoc -d mydoc -author -version HelloWorld.java

Jvm:

   是一个虚拟的计算机,是Java程序的运行环境。JVM具有指令集并使用不同的存储区域,负责执行指令,管理数据、内存、寄存器。

跨平台性:

   我们编写的Java代码,都运行在JVM 之上 ,只要在需要运行 java 应用程序的操作系统上,先安装一个Java虚拟机 (JVM ,Java Virtual Machine) 即可。由JVM来负责Java程序在该系统中的运行。这种机制屏蔽了底层运行平台的差别,实现了“一次编译,到处运行“的跨平台性。

自动内存管理:

内存分配:

   Java程序在运行过程中,涉及到运算的数据的分配存储等都由JVM来完成

内存回收(GC):

   Java消除了程序员回收无用内存空间的职责。提供了一种系统级线程跟踪存储空间的分配情况,通过GC的有向图的方式记录和管理堆(heap)中的所有对象,在内存空间达到相应阈值时,检查并释放可被释放的存储器空间。

   不再使用的内存空间应回收,忘记或者错误的内存回收会导致程序或系统的不稳定甚至崩溃

   垃圾回收机制只回收JVM堆内存里的堆空间。对其他物理连接,比如数据库连接、输入流输出流、Socket连接无能为力需要手动关闭。

   可以将对象的引用变量设置为null,暗示垃圾回收机制可以回收该对象。也可以通过System.gc()或者Runtime.getRuntime().gc()来通知系统进行垃圾回收,会有一些效果,但是系统是否进行垃圾回收依然不确定(Java语言规范并不保证GC一定会执行)。 垃圾回收在Java程序运行过程中自动进行具有不可预知性,程序无法精确控制垃圾回收机制执行(Java语言没有提供释放已分配内存的显示操作方法。)。

   垃圾回收机制回收任何对象之前,总会先调用它的finalize方法、如果覆盖该方法,让一个新的引用变量重新引用该对象,则会重新激活对象。永远不要主动调用某个对象的finalize方法,应该交给垃圾回收机制调用。

内存泄漏/溢出:

   GC的自动回收,提高了内存空间的利用效率,也提高了编程人员的效率,很大程度上减少了因为没有释放空间而导致的内存泄漏。但是Java程序还会出现内存泄漏和内存溢出问题.

内存泄露

   是指程序在申请内存后,无法释放已申请的内存空间。

   一次内存泄漏似乎不会有大的影响,但内存泄漏堆积后的后果就是内存溢出。

内存溢出:指程序申请内存时,没有足够的内存供申请者使用。