- 一、计算机语言概述
- 二、JAVA 的概述
- 三、JAVA 的发展史
- ️四、JAVA 语言的运行机制
- 五、开发 JAVA 的准备工作
- 六、JAVA 开发环境的搭建
- 九、第一个 JAVA 程序
- 十、JAVA 程序的基本规则
- 十一、JDK 9 新增的 jshell 命令
一、计算机语言概述
软件开发
-
软件:软件是一系列按照特定顺序组织的计算机数据和指令的集合。
- 常用的软件:
- 系统软件:
DOS
、Windows
、Linux
等 - 应用软件: 微信、
QQ
、迅雷、腾讯视频 等
- 系统软件:
- 常用的软件:
-
开发: 制作软件
人机交互
软件的出现实现了人与计算机之间的更好的交互
-
交互方式:
-
图形化界面(
Graphical User Interface
GUI
):这种方式简单直观,使用者易于接受,容易上手操作。
-
命令行方式(
Command Line Interface
CLI
):需要有一个控制台,输入特定的指令,让计算机完成一些操作。较为麻烦,需要记住一些计算机命令。
-
DOS 命令
-
什么是计算机语言
-
人类的语言:是人与人之间用于沟通的一种方式
中国人与中国人用中文交流,中国人与韩国人交流,要么中国人学韩语,要么韩国人学中文,或者二者使用国际通用语言。
-
计算机语言:是人与计算机交流的一种方式
如果人要与计算机交流,那么就要学习计算机语言,计算机语言有很多种,如:
C
、C++
、JAVA
等。
-
二、JAVA 的概述
JAVA
是一门非常纯粹的面向对象编程语言,吸收了 C++
语言的各种优点,摒弃了 C++
里难以理解的多继承、指针等概念。因此,JAVA
语言具有功能强大和简单易用的两个特征。JAVA
是面向对象语言的同时 JAVA
也是一种面向 Internet
的编程语言,随着 JAVA
技术在 WEB
方面的不断成熟,已经成为 WEB
应用程序的首选开发语言。是一门与平台无关的编程语言。
三、JAVA 的发展史
JAVA
从 2004 年 10 月发布的 JDK1.5
将以前的 JDK1.5(J2SE)
、J2EE
、J2ME
正式更名为:JAVASE
标准版、JAVAEE
企业版、JAVAME
小型版。
️四、JAVA 语言的运行机制
计算机高级语言按程序的执行方式可以分为:编译型和解释型两种。
编译型语言:
是指使用专门的编译器、针对特定的平台(操作系统)将某种高级语言源代码一次 "翻译" 成可被平台硬件执行的机器码,并包装成该平台所能识别的可执行性程序的格式,这个转换过程称为编译(Compile
)。编译生成的可执行性程序可以脱离开发环境,在特定的平台上独立运行。因为编译型语言是一次性地编译成机器码,所以可以脱离开发环境独立运行。通常运行效率高。但是因为编译型语言的程序被编译成特定平台上的机器码,所以只能在特定平台上运行,如果需要移植到其他平台上运行,则需要重新再编译一次(C
、C++
等都是编译型语言)。
解释型语言:
是指使用专门的解释器对源程序逐行解释成特定平台的机器码并立即执行的语言。解释型语言通常不会进行整体性的编译和链接处理,解释型语言相当于把编译型语言中的编译和解释过程混合到一起同时完成。可以认为,每次执行解释型语言的程序都需要进行一次编译,因此解释型语言的程序运行效率通常较低,而且不能脱离解释器独立运行。但是解释型语言有一个优势就是跨平台性,只需提供特定平台的解释器即可,每个特定平台上的解释器负责将源程序解释成特定平台的机器指令即可,解释型语言可以方便地实现源程序的移植,但是牺牲程序的执行效(Ruby
、Python
等都是解释型语言)。
JAVA 语言是一种特殊的高级语言,它既有解释型语言的特征,也具有编译型语言的特征,因为 JAVA 程序要经过先编译后解释的两个步骤。
JAVA
语言比较特殊,由 JAVA
语言编写的程序需要经过编译步骤,但是这个编译步骤并不会生成特定平台的机器码,而是生成一种与平台无关的字节码(*.class
文件)。当然这种字节码不是可执行的,必须使用 JAVA
解释器来解释执行(JVM
虚拟机)。JVM
是可运行 JAVA
字节码文件的虚拟计算机,所有平台上的 JVM
向编译器提供相同的编程接口,而编译器只需要面向虚拟机,生成虚拟机能理解的代码,然后由虚拟机来解释执行。
执行 Java 文件的两个步骤
当使用 JAVA
编译器编译 JAVA
程序时,生成的是与平台无关的字节码,这些字节码不面向任何具体平台,它只面向 JVM
。不同平台上的 JVM
都是不同的,但是他们都提供了相同的接口。JVM
是 JAVA
程序跨平台的关键部分,只要为不同平台实现了相应的虚拟机,编译后的 JAVA
字节码(.class
文件)就可以在该平台上运行。
五、开发 JAVA 的准备工作
JDK
(Java SE Development Kit
),即 JAVA
标准版开发包,它提供了编译、运行 JAVA
程序所需的各种工具和资源,包括 JAVA
编译器、JAVA
运行时环境、以及常用的 JAVA
类库等。
这里涉及到一个概念:JAVA
运行时环境(Java Runtime Environment -- JRE
),它是运行 JAVA
程序的必要条件。
如果我们只是要运行 JAVA
程序,我们可以只安装 JRE
,JDK
是开发用的包(也包括JRE
)。
ORACLE
公司把 JAVA
分为 JAVASE
、JAVAEE
和 JAVAME
三个部分,而且为 JAVASE
和 JAVAEE
分别提供了 JAVAEE
的 JDK
和 JAVAEE
的 SDK
两个开发包,如果只需要学习 JAVASE
的编程知识,可以下载标准的 JDK
。如果学完了 JAVASE
以后还要继续学习 JAVAEE
相关内容,也可以选择下载 JAVAEE
的 SDK
,安装 JAVAEE
的 SDK
的开发包就包含了 JAVASE
的 JDK
。
JRE
是JAVA
文件运行的环境(JVM
+JAVA
类库)JDK
是JAVA
文件运行的环境(JVM
+JAVA
类库) + 开发JAVA
的工具(JAVA
开发工具(JAVA SE Development Kit
))
六、JAVA 开发环境的搭建
基于 Windows 平台的 JAVA 环境搭建
-
JDK
的安装-
点击此处登陆
ORACLE
官网,下载最新版本的JDK
-
选择符合自己操作系统的
JDK
版本进行下载 -
接受
ORACLE
公司的协议许可,并选择符合自己操作系统的版本进行下载 -
双击下载好的文件进行安装
-
弹出的对话框如下,稍等片刻即可开始安装向导
-
在弹出的对话框中点击 "下一步" 继续
-
选择安装路径(尽量不要包含空格),并选择不安装公共的
JRE
,点击 "下一步" 继续 -
安装进度如下
-
在进度条走完以后,表示
JDK
安装成功,如下 -
安装完成后,可以在安装路径中看到的文件夹的含意
"bin文件夹" 该文件夹下存放了 JDK 的各种工具命令,如常用的 java、javac 等。 "db文件夹" 该文件夹下是安装 JAVA DB 的路径。 "include" 该文件夹下是一些平台特定的头文件。 "jre文件夹" 该文件夹下安装的就是运行 JAVA 程序所必需的JRE运行时环境。 "lib文件夹" 该文件夹下存放的是 JDK 工具命令的执行程序,如果使用 WinRAR 打开该文件夹下的 tools.jar 文件,将会看到如下所示的文件夹结构。 "src.zip" 该压缩包存放的就是 JAVA 所有核心类库的源代码。
-
-
JDK
的配置执行一个命名应该去该命令文件所在的目录下去操作,如果需要在任意目录下操作命令,则需要在系统中
"我的电脑" → "属性" → "环境变量" → "path" → 将需要执行的命令的目录添加到环境变量中并以分号(;)结束
每次配置完环境变量
DOS
窗口都需要重启才能生效新的环境变量的配置。Windows
操作系统是根据Path
环境变量来查找命令的,Path
环境变量的值是一些列的路径,Windows
操作系统将会在这一系列的路径中去查找您在控制台输入的命令,如果找到了这个命令这就执行,如果找遍所有Path
中设置的路径还是没有找到您输入的路径,则会出现如下提示XXXX 不是内部或外部命令,也不是可运行的程序货批量处理文件
P.S
-
Windows
操作系统不区分大小写,PATH
和Path
没有区别 -
在
JDK
环境变量配置之前,在DOS
窗口输入java
的命令如下
-
-
配置
PATH
环境变量不管是
Windows
还是Linux
操作系统,我们只需要把JDK
安装目录下的bin
文件夹下的所有命令都放到Path
环境变量中,就可以在任意目录执行JAVA
的编译和运行命令来执行JAVA
程序了。-
Win + D
快速显示桌面,右击计算机
→属性
-
在弹出的对话框中点击
高级系统设置
-
在弹出的对话框中点击
高级
→环境变量(N)...
-
在弹出的对话框中,点击
新建(W)...
,再在弹出的对话框中,新建名为JAVA_HOME
,值为JDK的安装根目录
-
找到
Path
并点击编辑(I)...
,然后在弹出的对话框中将上一步创建的JAVA_HOME
以%JAVA_HOME%\bin
的形式输入到Path
变量值的最前端,并且用英文分号(;
)结束。如下所示 -
最后如下
P.S
用户变量
和系统变量
它们并没有太大的区别,只是用户变量只对当前的用户有效,而系统变量对所有的用户有效。为了减少自己所做的修改对其他的用户产生影响,故可以设置用户变量的环境变量,对于当前用户而言,设置系统环境变量和用户环境变量基本相同。只是系统变量的路径排在用户变量的前面,系统变量找不到才去用户变量中去查找命令。
将JDK
的安装路径的bin
文件夹放到最前面,放到最前面是提高系统查找效率。注意是英文分号;
每次环境变量配置完成都需要重新开启DOS
窗口才生效。 -
再次新开一个
DOS
控制台,输入java -version
的命令,即可看到如下信息,表示JDK
环境变量配置生效
-
-
JDK
临时环境变量的配置DOS
窗口中set path = JDK 到 bin 文件夹的目录;%path%
此方法是在指定的环境变量上添加一个新的环境变量地址。如若直接set path = JDK到bin文件夹的目录
就会临时清除系统原来的环境变量。注意,此配置是对该DOS
命令窗口有效,窗口一关或者再开一个DOS
窗口一切都还原为系统原来的环境变量了。set 用于查看本机所有环境变量的信息 set 变量名 查看具体一个环境变量的值 set 变量名= 清空一个环境变量的值 set 变量名=具体值 给指定的环境变量赋值
在系统原有的环境变量基础上添加新值:
set path = 新值;%path%
这种临时的配置只在当前的
DOS
窗口有效,关闭窗口就无效了。
基于 Linux 平台的 JAVA 环境搭建
-
JDK
的安装在线下载
-
登录
Oracle
官网,找到需要下载的JDK
版本,点击下载 -
在浏览器弹出的下载进度中,
右击
→复制链接地
址,将下载链接复制到粘贴板 -
登录
Linux
系统,采用wget url
的方式进行在线下载wget http://download.oracle.com/otn/java/jdk/8u152-b16/aa0333dd3019491ca4f6ddbe78cdb6d0/jdk-8u152-linux-x64.tar.gz
-
下载完成以后得到的文件如下
离线下载
-
按照在线下载的第一步和第二步,将JDK压缩包下载到计算机本地。
-
下载完成以后,将本地下载好的
JDK
通过Xftp
上传到Linux
的规划目录 -
采用
Xshell
登录并进入到Linux
规划好的安装目录看到文件如下
-
-
JDK
的配置-
解压
JDK
压缩包tar -zxvf jdk-8u152-linux-64.tar.gz
-
打开概要配置文件,设置环境变量
vi /etc/profile
-
在profile中添加如下内容
# SET JAVA ENVIRONMENT JAVA_HOME=/usr/JAVA_HOME/jdk1.8.0_152 PATH=$PATH:$JAVA_HOME/bin export JAVA_HOME
-
修改后保存
-
让修改生效
source /etc/profile
-
验证JDK配置有效性
java -version java javac
-
九、第一个 JAVA 程序
-
宏观把握
JAVA
源代码的规范和程序的执行过程a.
JAVA
程序是纯粹的面向对象的程序设计语言b.
JAVA
程序严格区分大小写c.
JAVA
中主函数的出现就可以实现一个类的独立运行,JAVA
程序只能有一个main
函数入口d.
JAVA
中,所有的类名规范写法是每个单词的首字母要大写(public class DemoTest
)e.
JAVA
程序的执行过程 →编辑JAVA文件
→编译JAVA文件
→JVM运行JAVA编译出来的类(字节码)文件
-
编辑
JAVA
源代码// 如果类名用 public 修饰,则源文件名必须和类名一致,否则编译报错 // 如果类名没有用 public 修饰,则源文件名可以为任意名字。 // 但是编译出来的字节码文件则是和类名一致的,在运行时需要用 "java" 跟字节码文件名(也就是源文件的类名) public class HelloWorld { // main函数的固定写法 public static void main(String[] args){ System.out.println("Hello World !!!"); // 调用Bbb类中的静态方法print() Bbb.print(); } } // 在一个 JAVA 文件中只能存在一个用 public 修饰的类。 // 因为采用 public 修饰的类,该 JAVA 文件必须以 public 修饰的类名为文件名才不会编译报错 class Bbb{ static void print(){ System.out.println("Hello function print()!!!"); } }
-
编译
JAVA
程序(javac XXX.java
)JAVA
程序是严格区分大小写的,编译JAVA
程序可以使用javac
这个命令,有关javac
的帮助,可以在DOS
窗口中敲入javac
回车即可显示所有的帮助信息。JAVA
编译文件只需要指定存放编译后的目标文件的位置即可,无须指定字节码文件的文件名。因为javac
编译后生成的字节码文件有默认的文件名:文件名总是以源文件所定义类的类名来作为字节码主文件名,以.class
作为后缀名。这就意味着如果一个源文件有多个类,编译器在编译源文件的时候就会生成多个以各个类名为字节码文件名的.class
文件。实际上指定目标文件存放位置的-d
也是可以省略的,如果省略系统默认将生成的字节码文件放到当前路径下。采用
DOS
命令来编译JAVA
源程序-
WIN + R
→ 输入cmd
→Enter
→ 弹出DOS
命令窗口 -
采用
Windows
的DOS
命令进入编辑好的JAVA
文件夹的文件目录 -
在控制台输入
javac HelloWorld.java
,得到如下表示JAVA
源文件编译成功
用
EditPlus
来编译JAVA
源程序-
选择
EditPlus
的工具
→配置用户工具
菜单 -
在弹出的对话框中进行如下操作
-
配置好
EditPlus
以后,采用如下操作即可编译JAVA
源文件,并将编译好的.clsss
文件保存在JAVA
源文件的同级目录中
-
-
运行
JAVA
程序(java XXX(类名))运行
Java
程序使用java
命令,启动命令行窗口,进入编译后的字节码文件夹所在的位置:java XXX(.class文件的类名)
值得注意的是,
java
命令后的参数是JAVA
类名,而不是JAVA
源文件名。采用
DOS
窗口来运行JAVA
编译好的.class
文件用
EditPlus
来运行JAVA
编译好的.class
文件-
根据编译
JAVA
文件的配置类似配置如下 -
配置好运行
JAVA
的.class
文件的方式以后,运行JAVA
源代码效果如下
-
-
根据
CLASSPATH
环境变量来定位类CLASSPATH
环境变量的作用是什么?当我们使用
java JAVA类名
命令来运行JAVA
程序时,JRE
到底去哪里所搜JAVA
类呢?JDK1.4
以前是需要配置CLASSPATH
,目的就是为了在运行JAVA
程序时可以找到JAVA
类名的文件,所以要在配置CLASSPATH
环境变量时加上(.
)表示在当前目录下。但是在
JDK1.5
版本以后默认在当前源文件下查找,所以幸运的我们就不需要开了去配置CLASSPATH
环境变量了。
十、JAVA 程序的基本规则
-
JAVA
程序的组织形式JAVA
程序是一种纯粹的面向对象的程序设计语言,因此JAVA
程序必须以类(class
)的形式存在,类(class
)是JAVA
程序的最小程序单元。JAVA
程序不允许可执行性语句、方法等独立存在,所有的程序部分都必须放在类中定义。
JAVA
程序中的关键字全部都是小写的。最简单的
Java
程序是只包含一个空类的定义的程序:class Test{ }
此空类在编译时是没有任何问题的,但是在运行时,会提示找不到主函数
main()
JAVA
的入口函数而报错,但是这个类的定义是没有问题的,实际上JAVA
解释器规定:如果类能被解释器直接解释执行,则这个类必须包含main
方法,而且main
方法必须使用public static void
来修饰,且main
方法的形参必须是一个字符串数组(String[] xxx
),也就是说main
函数的写法基本上是固定的。JAVA
解释器就从这个main
函数开始执行,因此main
函数是JAVA
程序的入口。P.S
记住
main
函数的固定写法,以后解释为什么这么写。 -
JAVA
源文件的命名规则-
一个
JAVA
源文件名的命名可以是任意的,但是有一种特别,如果源文件中包含了public
修饰的类,则源文件名必须和public
所修饰的类名一致。 -
一个
JAVA
源文件可以包含多个类定义,但最多只能包含一个public
类定义。 -
如果
JAVA
源文件里面包含public
类定义,则该源文件的文件名必须与这个public
类的类名一致。
-
-
垃圾回收机制
传统的
C/C++
等编程语言,需要程序员负责回收已经分配的内存。显示进行垃圾回收是一件比较困难的事情。JAVA
语言不需要程序员直接控制内存回收,JAVA
程序的内存分配和回收都是由JRE
在后台自动进行的。JRE
会负责收回那些不再使用的内存,这种机制被称为垃圾回收(Garbage Collection
或GC
)。通常JRE
会提供一条超级线程来进行检测和控制,一般在CPU
空闲或者内存不足的情况下自动进行垃圾回收。而程序员无法精确垃圾回收的时间和顺序。 -
垃圾回收机制的特点
-
垃圾回收机制的工作目标是回收无用对象的内存空间,这些内存空间都是
JVM
堆内存里的内存空间,垃圾回收只能回收内存资源,对其他物理资源如数据库连接、磁盘IO
、等资源则无能为力。 -
为了更快地让垃圾回收机制回收那些不再使用的对象,可以将该对象的引用变量设置为
null
,通过这种方式暗示垃圾回收机制可以回收该对象。 -
垃圾回收发生的不可预知性,由于不同
JVM
采用了不同的垃圾回收机制和不同的垃圾回收算法,因此它有可能是定时发生,有可能是当CPU
空闲时发生,也有可能和原始的垃圾回收一样,等到内存消耗出现极限时发生。 -
垃圾回收的精确性主要包括:
-
垃圾回收机制能够精确标记活着的对象
-
垃圾回收器能够精确地定位对象之间的引用关系,前者是完全地回收所有废弃对象的前提。
-
-
-
各个
JDK
版本垃圾回收机制简单介绍-
2011年7月发布的
Java 7
提供了Gl
垃圾回收器来代替原有的并行标记 / 清除垃圾回收器(简称CMS
) -
2014年3月发布的
Java 8
删除了HotSpot NM
中的永生代内存(PermGen
,永生代内存主要用于存储一些需要常驻内存、通常不会被回收的信息),而是改为使用本地内存来存储类的元数据信息,并将之称为: 元空间(Metaspace
) ,这意味着以后不会再遇到java.lang.OutOfMemoryError:PermGen
错误(曾经令许多JAVA
程序员头痛的错误) -
2017年9月发布的
Java 9
彻底删除了传统的CMS
垃圾回收器,因此运行JVM
的DefNew + CMS
、ParNew + SerialOld
、Incremental CMS
等组合全部失效。JAVA
命令(该命令负责启用JVM
运行JAVA
程序)以前支持的以下GC
相关选项全部被删除-Xincgc -XX:+CMSIncrementalMode -XX:+UseCMSCompactAtFullCollection -XX:+CMSFullGCsBeforeCompaction -XX :+UseCMSCollectionP assing
此外,
-XX :+UseParNewGC
选项也被标记为过时, 将来也会被删除 -
Java 9
默认采用低暂停(low-pause
) 的Gl
垃圾回收器, 并为Gl
垃圾回收器自动确定了几个重要的参数设置,从而保证Gl
垃圾回收器的可用性、确定性和性能。如果部署项目时为Java
命令指定了-XX: +UseConcMarkSweepGC
选项希望启用CMS
垃圾回收器,系统会显示警告信息。
-
当我们编写 JAVA
程序时,一个基本原则是
对于不再需要使用的对象,不要再引用它们。
如果我们保持了对这些对象的引用,垃圾回收机制暂时不会回收该对象,则会导致系统可能内存越来越少。
当系统可用内存越来越少时,垃圾回收执行的频率也越高,从而导致系统的性能下降。
十一、JDK 9 新增的 jshell 命令
在 JDK 9
中提供了一个 jshell
工具,它是一个 REPL(Read-Eval_Print Loop)
工具,该工具是一个交互式的命令行窗口,可用于执行 JAVA
语言的变量声明、语句和表达式,而且可以立即查看到执行结果。因此,我们可以使用该工具来快速学习和测试 JAVA
的新 API
。
-
进入
CMD
控制台 -
输入
jshell
-
查看相关的帮助文档和命令
-
/help
说明jshell> /help | 键入 Java 语言表达式, 语句或声明。 | 或者键入以下命令之一: | /list [<名称或 id>|-all|-start] | 列出您键入的源 | /edit <名称或 id> | 编辑源条目 | /drop <名称或 id> | 删除源条目 | /save [-all|-history|-start] <文件> | 将片段源保存到文件 | /open <file> | 打开文件作为源输入 | /vars [<名称或 id>|-all|-start] | 列出已声明变量及其值 | /methods [<名称或 id>|-all|-start] | 列出已声明方法及其签名 | /types [<名称或 id>|-all|-start] | 列出类型声明 | /imports | 列出导入的项 | /exit [<integer-expression-snippet>] | 退出 jshell 工具 | /env [-class-path <路径>] [-module-path <路径>] [-add-modules <模块>] ... | 查看或更改评估上下文 | /reset [-class-path <路径>] [-module-path <路径>] [-add-modules <模块>]... | 重置 jshell 工具 | /reload [-restore] [-quiet] [-class-path <路径>] [-module-path <路径>]... | 重置和重放相关历史记录 -- 当前历史记录或上一个历史记录 (-restore) | /history [-all] | 您键入的内容的历史记录 | /help [<command>|<subject>] | 获取有关使用 jshell 工具的信息 | /set editor|start|feedback|mode|prompt|truncation|format ... | 设置配置信息 | /? [<command>|<subject>] | 获取有关使用 jshell 工具的信息 | /! | 重新运行上一个片段 -- 请参阅 /help rerun | /<id> | 按 ID 或 ID 范围重新运行片段 -- 参见 /help rerun | /-<n> | 重新运行以前的第 n 个片段 -- 请参阅 /help rerun | | 有关详细信息, 请键入 '/help', 后跟 | 命令或主题的名称。 | 例如 '/help /list' 或 '/help intro'。主题: | | intro | jshell 工具的简介 | keys | 类似 readline 的输入编辑的说明 | id | 片段 ID 以及如何使用它们的说明 | shortcuts | 片段和命令输入提示, 信息访问以及 | 自动代码生成的按键说明 | context | /env /reload 和 /reset 的评估上下文选项的说明 | rerun | 重新评估以前输入片段的方法的说明 jshell>