001_JAVA 语言的概述和 JAVA 开发环境的搭建

Rambo 2020年05月24日 371次浏览

一、计算机语言概述

软件开发

  • 软件:软件是一系列按照特定顺序组织的计算机数据和指令的集合。

    • 常用的软件:
      • 系统软件: DOSWindowsLinux
      • 应用软件: 微信、QQ、迅雷、腾讯视频 等
  • 开发: 制作软件

人机交互

软件的出现实现了人与计算机之间的更好的交互

  • 交互方式:

    • 图形化界面(Graphical User Interface GUI):

      这种方式简单直观,使用者易于接受,容易上手操作。

    • 命令行方式(Command Line Interface CLI):

      需要有一个控制台,输入特定的指令,让计算机完成一些操作。较为麻烦,需要记住一些计算机命令。

DOS 命令

  • 什么是计算机语言

    • 人类的语言:是人与人之间用于沟通的一种方式

      中国人与中国人用中文交流,中国人与韩国人交流,要么中国人学韩语,要么韩国人学中文,或者二者使用国际通用语言。

    • 计算机语言:是人与计算机交流的一种方式

      如果人要与计算机交流,那么就要学习计算机语言,计算机语言有很多种,如:CC++JAVA 等。

二、JAVA 的概述

  JAVA 是一门非常纯粹的面向对象编程语言,吸收了 C++ 语言的各种优点,摒弃了 C++ 里难以理解的多继承、指针等概念。因此,JAVA 语言具有功能强大简单易用的两个特征。JAVA 是面向对象语言的同时 JAVA 也是一种面向 Internet 的编程语言,随着 JAVA 技术在 WEB 方面的不断成熟,已经成为 WEB 应用程序的首选开发语言。是一门与平台无关的编程语言。

三、JAVA 的发展史

  JAVA 从 2004 年 10 月发布的 JDK1.5 将以前的 JDK1.5(J2SE)J2EEJ2ME 正式更名为:JAVASE 标准版、JAVAEE 企业版、JAVAME 小型版。

️四、JAVA 语言的运行机制

计算机高级语言按程序的执行方式可以分为:编译型解释型两种。

编译型语言:

  是指使用专门的编译器、针对特定的平台(操作系统)将某种高级语言源代码一次 "翻译" 成可被平台硬件执行的机器码,并包装成该平台所能识别的可执行性程序的格式,这个转换过程称为编译(Compile)。编译生成的可执行性程序可以脱离开发环境,在特定的平台上独立运行。因为编译型语言是一次性地编译成机器码,所以可以脱离开发环境独立运行。通常运行效率高。但是因为编译型语言的程序被编译成特定平台上的机器码,所以只能在特定平台上运行,如果需要移植到其他平台上运行,则需要重新再编译一次(CC++ 等都是编译型语言)。

解释型语言:

  是指使用专门的解释器对源程序逐行解释成特定平台的机器码并立即执行的语言。解释型语言通常不会进行整体性的编译和链接处理,解释型语言相当于把编译型语言中的编译和解释过程混合到一起同时完成。可以认为,每次执行解释型语言的程序都需要进行一次编译,因此解释型语言的程序运行效率通常较低,而且不能脱离解释器独立运行。但是解释型语言有一个优势就是跨平台性,只需提供特定平台的解释器即可,每个特定平台上的解释器负责将源程序解释成特定平台的机器指令即可,解释型语言可以方便地实现源程序的移植,但是牺牲程序的执行效(RubyPython 等都是解释型语言)。

JAVA 语言是一种特殊的高级语言,它既有解释型语言的特征,也具有编译型语言的特征,因为 JAVA 程序要经过先编译后解释的两个步骤。

  JAVA 语言比较特殊,由 JAVA 语言编写的程序需要经过编译步骤,但是这个编译步骤并不会生成特定平台的机器码,而是生成一种与平台无关的字节码(*.class 文件)。当然这种字节码不是可执行的,必须使用 JAVA 解释器来解释执行(JVM 虚拟机)。JVM 是可运行 JAVA 字节码文件的虚拟计算机,所有平台上的 JVM 向编译器提供相同的编程接口,而编译器只需要面向虚拟机,生成虚拟机能理解的代码,然后由虚拟机来解释执行。

执行 Java 文件的两个步骤

mark

  当使用 JAVA 编译器编译 JAVA 程序时,生成的是与平台无关的字节码,这些字节码不面向任何具体平台,它只面向 JVM。不同平台上的 JVM 都是不同的,但是他们都提供了相同的接口。JVMJAVA 程序跨平台的关键部分,只要为不同平台实现了相应的虚拟机,编译后的 JAVA 字节码(.class文件)就可以在该平台上运行。

五、开发 JAVA 的准备工作

  JDKJava SE Development Kit),即 JAVA 标准版开发包,它提供了编译、运行 JAVA 程序所需的各种工具和资源,包括 JAVA 编译器、JAVA 运行时环境、以及常用的 JAVA 类库等。
这里涉及到一个概念:JAVA 运行时环境(Java Runtime Environment -- JRE),它是运行 JAVA 程序的必要条件。

  如果我们只是要运行 JAVA 程序,我们可以只安装 JREJDK是开发用的包(也包括JRE)。

  ORACLE 公司把 JAVA 分为 JAVASEJAVAEEJAVAME 三个部分,而且为 JAVASEJAVAEE 分别提供了 JAVAEEJDKJAVAEESDK 两个开发包,如果只需要学习 JAVASE 的编程知识,可以下载标准的 JDK 。如果学完了 JAVASE 以后还要继续学习 JAVAEE 相关内容,也可以选择下载 JAVAEESDK,安装 JAVAEESDK 的开发包就包含了 JAVASEJDK

  • JREJAVA 文件运行的环境(JVM + JAVA 类库)
  • JDKJAVA 文件运行的环境(JVM + JAVA 类库) + 开发 JAVA 的工具(JAVA 开发工具(JAVA SE Development Kit))

六、JAVA 开发环境的搭建

基于 Windows 平台的 JAVA 环境搭建
  • JDK的安装

    1. 点击此处登陆 ORACLE 官网,下载最新版本的 JDK

      mark

    2. 选择符合自己操作系统的 JDK 版本进行下载

      mark

    3. 接受 ORACLE 公司的协议许可,并选择符合自己操作系统的版本进行下载

      mark

    4. 双击下载好的文件进行安装

      mark

    5. 弹出的对话框如下,稍等片刻即可开始安装向导

      mark

    6. 在弹出的对话框中点击 "下一步" 继续

      mark

    7. 选择安装路径(尽量不要包含空格),并选择不安装公共的 JRE,点击 "下一步" 继续

      mark

    8. 安装进度如下

      mark

    9. 在进度条走完以后,表示 JDK 安装成功,如下

      mark

    10. 安装完成后,可以在安装路径中看到的文件夹的含意

      mark

      "bin文件夹" 该文件夹下存放了 JDK 的各种工具命令,如常用的 java、javac 等。
      "db文件夹"  该文件夹下是安装 JAVA DB 的路径。
      "include"   该文件夹下是一些平台特定的头文件。
      "jre文件夹" 该文件夹下安装的就是运行 JAVA 程序所必需的JRE运行时环境。
      "lib文件夹" 该文件夹下存放的是 JDK 工具命令的执行程序,如果使用 WinRAR 打开该文件夹下的 tools.jar 文件,将会看到如下所示的文件夹结构。
      "src.zip"   该压缩包存放的就是 JAVA 所有核心类库的源代码。
      

      mark

  • JDK的配置

    执行一个命名应该去该命令文件所在的目录下去操作,如果需要在任意目录下操作命令,则需要在系统中

    "我的电脑" → "属性" → "环境变量" → "path" → 将需要执行的命令的目录添加到环境变量中并以分号(;)结束
    

    每次配置完环境变量 DOS 窗口都需要重启才能生效新的环境变量的配置。

    Windows 操作系统是根据 Path 环境变量来查找命令的,Path 环境变量的值是一些列的路径,Windows 操作系统将会在这一系列的路径中去查找您在控制台输入的命令,如果找到了这个命令这就执行,如果找遍所有 Path 中设置的路径还是没有找到您输入的路径,则会出现如下提示

    XXXX 不是内部或外部命令,也不是可运行的程序货批量处理文件
    

    P.S

    • Windows 操作系统不区分大小写,PATHPath 没有区别

    • JDK 环境变量配置之前,在 DOS 窗口输入 java 的命令如下

      mark

  • 配置 PATH 环境变量

    不管是 Windows 还是 Linux 操作系统,我们只需要把 JDK 安装目录下的 bin 文件夹下的所有命令都放到 Path 环境变量中,就可以在任意目录执行 JAVA 的编译和运行命令来执行 JAVA 程序了。

    1. Win + D 快速显示桌面,右击 计算机属性

      mark

    2. 在弹出的对话框中点击 高级系统设置

      mark

    3. 在弹出的对话框中点击 高级环境变量(N)...

      mark

    4. 在弹出的对话框中,点击 新建(W)...,再在弹出的对话框中,新建名为 JAVA_HOME,值为 JDK的安装根目录

      mark

    5. 找到 Path 并点击 编辑(I)...,然后在弹出的对话框中将上一步创建的 JAVA_HOME%JAVA_HOME%\bin 的形式输入到 Path 变量值的最前端,并且用英文分号(;)结束。如下所示

      mark

    6. 最后如下

      mark

      P.S

      用户变量系统变量

        它们并没有太大的区别,只是用户变量只对当前的用户有效,而系统变量对所有的用户有效。为了减少自己所做的修改对其他的用户产生影响,故可以设置用户变量的环境变量,对于当前用户而言,设置系统环境变量和用户环境变量基本相同。只是系统变量的路径排在用户变量的前面,系统变量找不到才去用户变量中去查找命令。
      JDK 的安装路径的 bin 文件夹放到最前面,放到最前面是提高系统查找效率。注意是英文分号 ; 每次环境变量配置完成都需要重新开启 DOS 窗口才生效。

    7. 再次新开一个 DOS 控制台,输入 java -version 的命令,即可看到如下信息,表示 JDK 环境变量配置生效

      mark

  • JDK 临时环境变量的配置

      DOS 窗口中 set path = JDK 到 bin 文件夹的目录;%path% 此方法是在指定的环境变量上添加一个新的环境变量地址。如若直接 set path = JDK到bin文件夹的目录 就会临时清除系统原来的环境变量。注意,此配置是对该 DOS 命令窗口有效,窗口一关或者再开一个 DOS 窗口一切都还原为系统原来的环境变量了。

    set             用于查看本机所有环境变量的信息
    set 变量名       查看具体一个环境变量的值
    set 变量名=      清空一个环境变量的值
    set 变量名=具体值 给指定的环境变量赋值
    

    在系统原有的环境变量基础上添加新值:

    set path = 新值;%path%
    

    这种临时的配置只在当前的 DOS 窗口有效,关闭窗口就无效了

基于 Linux 平台的 JAVA 环境搭建
  • JDK的安装

    在线下载

    1. 登录 Oracle 官网,找到需要下载的 JDK 版本,点击下载

      mark

    2. 在浏览器弹出的下载进度中,右击复制链接地址,将下载链接复制到粘贴板

      mark

    3. 登录 Linux 系统,采用wget url的方式进行在线下载

      wget http://download.oracle.com/otn/java/jdk/8u152-b16/aa0333dd3019491ca4f6ddbe78cdb6d0/jdk-8u152-linux-x64.tar.gz
      

      mark

    4. 下载完成以后得到的文件如下

      mark

    离线下载

    1. 按照在线下载的第一步和第二步,将JDK压缩包下载到计算机本地。

    2. 下载完成以后,将本地下载好的 JDK 通过 Xftp 上传到 Linux 的规划目录

      mark

    3. 采用 Xshell 登录并进入到 Linux 规划好的安装目录看到文件如下

      mark

  • JDK的配置

    1. 解压 JDK 压缩包

      tar -zxvf jdk-8u152-linux-64.tar.gz  
      

      mark

    2. 打开概要配置文件,设置环境变量

      vi /etc/profile
      
    3. 在profile中添加如下内容

      # SET JAVA ENVIRONMENT
      JAVA_HOME=/usr/JAVA_HOME/jdk1.8.0_152
      PATH=$PATH:$JAVA_HOME/bin
      export JAVA_HOME
      
    4. 修改后保存

      mark

    5. 让修改生效

      source /etc/profile
      

      mark

    6. 验证JDK配置有效性

      java -version
      
      java
      
      javac
      

      mark

九、第一个 JAVA 程序

  1. 宏观把握 JAVA 源代码的规范和程序的执行过程

    a. JAVA 程序是纯粹的面向对象的程序设计语言

    b. JAVA 程序严格区分大小写

    c. JAVA 中主函数的出现就可以实现一个类的独立运行,JAVA 程序只能有一个 main 函数入口

    d. JAVA 中,所有的类名规范写法是每个单词的首字母要大写(public class DemoTest

    e. JAVA 程序的执行过程 → 编辑JAVA文件编译JAVA文件JVM运行JAVA编译出来的类(字节码)文件

  2. 编辑 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()!!!");
       }
    }
    
  3. 编译 JAVA 程序( javac XXX.java

      JAVA 程序是严格区分大小写的,编译 JAVA 程序可以使用 javac 这个命令,有关 javac 的帮助,可以在 DOS 窗口中敲入 javac 回车即可显示所有的帮助信息。

      JAVA 编译文件只需要指定存放编译后的目标文件的位置即可,无须指定字节码文件的文件名。因为 javac 编译后生成的字节码文件有默认的文件名:文件名总是以源文件所定义类的类名来作为字节码主文件名,以 .class 作为后缀名。这就意味着如果一个源文件有多个类,编译器在编译源文件的时候就会生成多个以各个类名为字节码文件名的 .class 文件。实际上指定目标文件存放位置的 -d 也是可以省略的,如果省略系统默认将生成的字节码文件放到当前路径下。

    采用 DOS 命令来编译 JAVA 源程序

    • WIN + R → 输入 cmdEnter → 弹出 DOS 命令窗口

    • 采用 WindowsDOS 命令进入编辑好的 JAVA 文件夹的文件目录

    • 在控制台输入 javac HelloWorld.java ,得到如下表示 JAVA 源文件编译成功

    mark

    EditPlus 来编译 JAVA 源程序

    • 选择 EditPlus工具配置用户工具 菜单

    • 在弹出的对话框中进行如下操作

      mark

    • 配置好 EditPlus 以后,采用如下操作即可编译 JAVA 源文件,并将编译好的 .clsss 文件保存在 JAVA 源文件的同级目录中

      mark

  4. 运行 JAVA 程序(java XXX(类名)

      运行 Java 程序使用 java 命令,启动命令行窗口,进入编译后的字节码文件夹所在的位置: java XXX(.class文件的类名)

      值得注意的是, java 命令后的参数是 JAVA 类名,而不是 JAVA 源文件名。

    采用 DOS 窗口来运行 JAVA 编译好的 .class 文件

    mark

    EditPlus 来运行 JAVA 编译好的 .class 文件

    • 根据编译 JAVA 文件的配置类似配置如下

      mark

    • 配置好运行 JAVA.class 文件的方式以后,运行 JAVA 源代码效果如下

      mark

  5. 根据 CLASSPATH 环境变量来定位类

    CLASSPATH 环境变量的作用是什么?

      当我们使用 java JAVA类名 命令来运行 JAVA 程序时,JRE 到底去哪里所搜 JAVA 类呢?JDK1.4 以前是需要配置 CLASSPATH,目的就是为了在运行 JAVA 程序时可以找到 JAVA 类名的文件,所以要在配置 CLASSPATH 环境变量时加上(.)表示在当前目录下。

      但是在 JDK1.5 版本以后默认在当前源文件下查找,所以幸运的我们就不需要开了去配置 CLASSPATH 环境变量了。

十、JAVA 程序的基本规则

  1. 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 函数的固定写法,以后解释为什么这么写。

  2. JAVA 源文件的命名规则

    • 一个 JAVA 源文件名的命名可以是任意的,但是有一种特别,如果源文件中包含了 public 修饰的类,则源文件名必须和 public 所修饰的类名一致。

    • 一个 JAVA 源文件可以包含多个类定义,但最多只能包含一个 public 类定义。

    • 如果 JAVA 源文件里面包含 public 类定义,则该源文件的文件名必须与这个 public 类的类名一致。

  3. 垃圾回收机制

      传统的 C/C++ 等编程语言,需要程序员负责回收已经分配的内存。显示进行垃圾回收是一件比较困难的事情。JAVA 语言不需要程序员直接控制内存回收,JAVA 程序的内存分配和回收都是由 JRE 在后台自动进行的。JRE 会负责收回那些不再使用的内存,这种机制被称为垃圾回收(Garbage CollectionGC)。通常 JRE 会提供一条超级线程来进行检测和控制,一般在 CPU 空闲或者内存不足的情况下自动进行垃圾回收。而程序员无法精确垃圾回收的时间和顺序。

  4. 垃圾回收机制的特点

    • 垃圾回收机制的工作目标是回收无用对象的内存空间,这些内存空间都是 JVM 堆内存里的内存空间,垃圾回收只能回收内存资源,对其他物理资源如数据库连接、磁盘 IO、等资源则无能为力。

    • 为了更快地让垃圾回收机制回收那些不再使用的对象,可以将该对象的引用变量设置为 null,通过这种方式暗示垃圾回收机制可以回收该对象。

    • 垃圾回收发生的不可预知性,由于不同 JVM 采用了不同的垃圾回收机制和不同的垃圾回收算法,因此它有可能是定时发生,有可能是当 CPU 空闲时发生,也有可能和原始的垃圾回收一样,等到内存消耗出现极限时发生。

    • 垃圾回收的精确性主要包括:

      1. 垃圾回收机制能够精确标记活着的对象

      2. 垃圾回收器能够精确地定位对象之间的引用关系,前者是完全地回收所有废弃对象的前提。

  5. 各个 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 垃圾回收器,因此运行 JVMDefNew + CMSParNew + SerialOldIncremental 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

  1. 进入 CMD 控制台

  2. 输入 jshell

  3. 查看相关的帮助文档和命令

    mark

  4. /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>