Java 基础知识

前言

1、Java

  • Java 是由 Sun Microsystems 公司于 1995 年 5 月推出的 Java 面向对象程序设计语言和 Java 平台的总称。由詹姆斯·高斯林 (James Gosling) 和同事们共同研发,并在 1995 年正式推出。

  • Java 分为三个体系

    • Java SE(J2SE):Java 2 Platform Standard Edition,Java 平台标准版
    • Java EE(J2EE):Java 2 Platform Enterprise Edition,Java 平台企业版
    • Java ME(J2ME):Java 2 Platform Micro Edition,Java 平台微型版
  • 主要发展历史

    • 1995 年 5 月 23 日,Java 语言诞生。
    • 2004 年 9 月 30 日 18:00PM,J2SE 1.5 发布,成为 Java 语言发展史上的又一里程碑。为了表示该版本的重要性,J2SE 1.5 更名为 Java SE 5.0。
    • 2005 年 6 月,JavaOne 大会召开,Sun 公司公开 Java SE 6。此时,Java 的各种版本已经更名以取消其中的数字 “2”:J2EE 更名为 Java EE, J2SE 更名为 Java SE,J2ME 更名为 Java ME。
    • 2009 年 4 月 20 日,甲骨文(Oracle)74 亿美元收购 Sun。取得 java 的版权。
  • 主要特性

    • Java 语言是简单的
    • Java 语言是面向对象的
    • Java 语言是分布式的
    • Java 语言是健壮的
    • Java 语言是安全的
    • Java 语言是体系结构中立的
    • Java 语言是可移植的
    • Java 语言是解释型的
    • Java 语言是高性能的
    • Java 语言是多线程的
    • Java 语言是动态的

2、JDK 环境配置

  • JDK(Java Development Kit) 是 Java 开发工具包,除了运行和编译相关的工具外,最重要的是封装了很多方法(function / method / api)。

  • JDK 文件目录

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    # 示例 macOS v11.6.6 系统

    根目录:/Library/Java/JavaVirtualMachines/jdk1.8.0_181.jdk/Contents/Home/

    bin:目录下存放 JDK 用于开发的一些终端命令工具。常见的工具如:
    “javac” 的作用是将 java 源文件编译为 class 文件(即自解码文件);
    “java” 命令的作用是运行 class 文件。

    db: 目录下是 java 开发的一个开源的关系型数据库;
    include:目录下是一些 C 语言的头文件;
    jre: 目录下是 JDK 所依赖的 java 运行时;
    lib: 目录下存放 JDK 开发工具所依赖的一些库文件;
    man: 目录下存放 JDK 开发工具的说明文档。
  • JDK 版本的选择

    • 安装 JDK 的时候,有的人推荐 1.6(也有叫 6.0 的),也有说用 1.7 和 1.8 的。

    • 1.5 和 1.6 就太老了,连 1.8,Oracle 都发出 2019 年 1 月停止更新的通知了。

    • 1.7、1.8、1.9 都是成熟版本,原则上都可以选用,公司的商业项目 JDK 一般不轻易升级。

      • 1.9 用的比较少,加上上面的配套框架升级速度的考虑,1.9 版本第二推荐位。

      • 1.8 和 1.7 的应用都比较广泛,那自然选更新更高级的版本,所以,最推荐用 1.8 版本。

2.1 JDK 和 JRE

  • JDK 和 JRE 的区别

  • JDK(Java Development Kit)是 Java 的开发工具包。

  • JRE(Java Runtime Environment)是 Java 程序的运行环境。

  • JVM(Java Virtual Machine)是 Java 虚拟机,是一种程序虚拟机(相对操作系统虚拟机)。

2.2 环境配置

  • 相关软件下载

  • 环境配置

  • 环境变量配置

    1
    2
    3
    4
    # macOS
    export JAVA_HOME=`/usr/libexec/java_home`
    export PATH=${PATH}:${JAVA_HOME}:${ANDROID_SDK_ROOT}:${ANDROID_SDK_ROOT}/platform-tools:${ANDROID_SDK_ROOT}/tools:${JAVA_HOME}:${JAVA_HOME}/bin
    export PATH="/usr/local/bin:/usr/local/sbin:~/bin:$PATH"
    1
    2
    3
    4
    # Windows
    # 系统变量
    JAVA_HOME E:\JDK
    Path %JAVA_HOME%\bin;
  • 查看结果

    1
    2
    3
    4
    5
    # 在终端输入以下代码,查看 java 版本
    $ java -version

    # 配置成功后,会出现版本信息,如下
    java version "1.8.0_181"
    1
    2
    3
    4
    5
    # 在终端输入以下代码,查看 java 配置路径
    $ echo $JAVA_HOME

    # 配置成功后,会出现路径信息,如下
    /Library/Java/JavaVirtualMachines/jdk1.8.0_181.jdk/Contents/Home

3、Java API

3.1 JDK 11

  • JDK 11 在线中文手册

    • Java SE

      • Java 平台标准版(Java SE)API 定义了用于通用计算的核心 Java 平台。
      • 这些 API 位于名称以 java 开头的模块中。
    • JDK

      • Java Development Kit(JDK)API 特定于 JDK,并不一定适用于 Java SE Platform 的所有实现。
      • 这些 API 位于名称以 jdk 开头的模块中。
  • Java SE API

模块 描述
java.base 定义 Java SE 平台的基础 API。
java.compiler 定义语言模型,注释处理和 Java 编译器 API。
java.datatransfer 定义用于在应用程序之间和应用程序内传输数据的 API。
java.desktop 定义 AWT 和 Swing 用户界面工具包,以及用于辅助功能,音频,图像,打印和 JavaBeans 的 API。
java.instrument 定义允许代理程序检测在JVM上运行的程序的服务。
java.logging 定义 Java Logging API。
java.management 定义 Java Management Extensions(JMX)API。
java.management.rmi 为 Java Management Extensions(JMX)Remote API 定义 RMI connector 。
java.naming 定义 Java 命名和目录接口(JNDI)API。
java.net.http 定义 HTTP 客户端和 WebSocket API。
java.prefs 定义 Preferences API。
java.rmi 定义远程方法调用(RMI)API。
java.scripting 定义 Scripting API。
java.se 定义 Java SE 平台的 API。
java.security.jgss 定义 IETF 通用安全服务 API(GSS-API)的 Java 绑定。
java.security.sasl 定义对 IETF 简单身份验证和安全层(SASL)的 Java 支持。
java.sql 定义 JDBC API。
java.sql.rowset 定义 JDBC RowSet API。
java.transaction.xa 定义用于在 JDBC 中支持分布式事务的 API。
java.xml 定义用于 XML 处理的 Java API(JAXP),用于 XML 的 Streaming API(StAX),用于 XML 的简单 API(SAX)和 W3C 文档对象模型(DOM)API。
java.xml.crypto 定义 XML 加密的 API。
java.smartcardio 定义 Java 智能卡 I / O API。
  • JDK API
模块 描述
jdk.accessibility 定义 Assistive Technologies 实现者使用的 JDK 实用程序类。
jdk.attach 定义附加 API。
jdk.charsets 提供不在 java.base 中的 java.base (主要是双字节和 IBM 字符集)。
jdk.compiler 定义 system Java compiler 及其命令行等效项 javac 的实现 。
jdk.crypto.cryptoki 提供 SunPKCS11 安全提供程序的实现。
jdk.crypto.ec 提供 SunEC 安全提供程序的实现。
jdk.dynalink 定义用于动态链接对象上的高级操作的 API。
jdk.editpad 提供 jdk.jshell 使用的编辑板服务的 实现 。
jdk.hotspot.agent 定义 HotSpot 可维护性代理的实现。
jdk.httpserver 定义特定于 JDK 的 HTTP 服务器 API。
jdk.jartool 定义用于处理 Java Archive(JAR)文件的工具,包括 jar 和 jarsigner 工具。
jdk.javadoc 定义 system documentation tool 及其命令行等效项 javadoc 的实现 。
jdk.jcmd 定义诊断和故障排除一个 JVM,如工具 jcmd , jps , jstat 个工具。
jdk.jconsole 定义 JMX 图形工具 jconsole ,用于监视和管理正在运行的应用程序。
jdk.jdeps 定义用于分析 Java 库和程序,包括依赖工具 jdeps , javap 和 jdeprscan 工具。
jdk.jdi 定义 Java 调试接口。
jdk.jdwp.agent 提供 Java 调试线协议(JDWP)代理的实现。
jdk.jfr 定义 JDK Flight Recorder的API。
jdk.jlink 定义 jlink 创建运行时图像,工具 jmod 工具,用于创建和操纵 JMOD 文件和 jimage 工具用于检查类和资源的 JDK 实现特定的容器文件。
jdk.jshell 该模块支持 Java Programming Language ‘片段’评估工具,例如 Read-Eval-Print Loops(REPL),包括 jshell 工具。
jdk.jsobject 定义 JavaScript 对象的 API。
jdk.jstatd 定义 jstatd 工具,用于启动 jstat 工具的守护程序,以远程监视 JVM 统计信息。
jdk.localedata 提供 US locale 以外的语言环境的区域设置数据。
jdk.management 为 JVM 定义特定于 JDK 的管理接口。
jdk.management.agent 定义 JMX 管理代理程序。
jdk.management.jfr 定义 JDK Flight Recorder 的管理界面。
jdk.naming.dns 提供 DNS Java 命名提供程序的实现。
jdk.naming.rmi 提供 RMI Java 命名提供程序的实现。
jdk.net 定义 JDK 特定的 Networking API。
jdk.pack 定义用于将 JAR 文件转换为压缩 pack200 文件并将打包文件转换为 JAR 文件的工具,包括 pack200 和 unpack200 工具。
jdk.rmic 定义 rmic 编译器,用于使用远程对象的 Java 远程方法协议(JRMP)生成存根和骨架。
jdk.scripting.nashorn 为 ECMAScript 5.1 中编写的程序提供 Nashorn 脚本引擎和运行时环境的实现。
jdk.sctp 为 SCTP 定义特定于 JDK 的 API。
jdk.security.auth 提供 javax.security.auth.* 接口和各种身份验证模块的实现。
jdk.security.jgss 定义 GSS-API的JDK 扩展和 SASL GSSAPI 机制的实现。
jdk.xml.dom 定义不属于 Java SE API 的 W3C 文档对象模型(DOM)API 的子集。
jdk.zipfs 提供 zip 文件系统提供程序的实现。

3.2 JDK 1.8

4、Java 程序

4.1 实例

  • 创建文件 Hello.java(文件名需与类名一致)。

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    // Hello.java 文件

    public class Hello {

    // main methord
    public static void main(String[] args) {

    // Output: Hello, world!
    System.out.println("Hello, world!");
    }
    }
  • 一个 .java 源文件中可以包括多个类,但是只能出现一个 public 修饰的类,但是可以出现多个非 public 修饰的类。

  • .java 文件是 Java 的源文件,但是不能直接运行,必须先被编译成为 .class 文件才能够执行。

4.2 命令行编译运行

  • 编译

    1
    2
    # 将 java 源文件编译为 class 文件(即自解码文件)
    $ javac Hello.java
  • 运行

    1
    2
    3
    4
    5
    # 运行 .class 文件
    $ java Hello

    # 终端输出
    Hello, world!

4.3 服务部署

  • 运行 jar / war 包

    1
    2
    3
    4
    5
    # 运行 jar / war 包
    $ java -jar demo.jar

    # 后台运行 jar / war 包,输出日志到文件 nohup.out 中
    $ nohup java -jar demo.jar >nohup.out 2>&1 &
  • 查寻进程

    1
    2
    # 查寻 java 的所有进程
    $ ps -ef | grep java
  • 杀死进程

    1
    2
    # 杀死进程,17933 为具体进程号
    $ kill -9 17933
  • 前端部署

    1
    2
    # 前端部署,直接替换打包文件
    $ scp -r demoWebFiles root@domain_name.com:/var/www/html/
  • 后端部署

    1
    2
    3
    # 后端部署,先替换打包文件 -> 杀死当前进程 -> 重新运行 jar 包
    $ scp -r demo.jar root@domain_name.com:/var/www/demo/
    $ nohup java -jar demo.jar >/var/www/demo/nohup.out 2>&1 &

4.3.1 nohup 命令

  • 在应用 Unix/Linux 时,我们一般想让某个程序在后台运行,于是我们将常会用 & 在程序结尾来让程序自动运行。

  • 而有些则无法使用 & 来自动运行,需采用项目中的 nohup 方式存底。

  • nohup 命令

    • 用途:不挂断地运行命令。
    • 语法:nohup Command [ Arg … ] [ & ]
  • 示例

    1
    $ nohup java -jar BiuBiuBiu.jar >output 2>&1 &
  • 解释

    • & 的命令行,即使 terminal(终端)关闭,或者电脑死机程序依然运行(前提是你把程序递交到服务器上)。

    • 2>&1 的意思是把标准错误(2)重定向到标准输出中(1),而标准输出又导入文件 output 里面,所以结果是标准错误和标准输出都导入文件 output 里面了。

    • 至于为什么需要将标准错误重定向到标准输出的原因,那就归结为标准错误没有缓冲区,而 stdout 有。

    • 这就会导致 >output 2>output,文件 output 被两次打开,而 stdout 和 stderr 将会竞争覆盖,这肯定不是我门想要的。
    • 这就是为什么有人会写成:nohup ./command.sh >output 2>output 出错的原因了。
  • 最后谈一下 /dev/null 文件的作用,这是一个无底洞,任何东西都可以定向到这里,但是却无法打开。所以一般很大的 stdou 和 stderr 当你不关心的时候可以利用 stdout 和 stderr 定向到这里 ./start.sh >/dev/null 2>&1

  • 一般不需要查看的日志就直接丢掉。

    1
    $ nohup java -jar BiuBiuBiu.jar >/dev/null 2>&1 &

4.3.2 ps、grep 命令

  • ps 命令将某个进程显示出来,是 Linux 下最常用的也是非常强大的进程查看命令。

  • grep 命令是查找,是一种强大的文本搜索工具,它能使用正则表达式搜索文本,并把匹配的行打印出来,grep 全称是 Global Regular Expression Print,表示全局正则表达式版本,它的使用权限是所有用户。

  • 中间的 | 是管道命令,是指 ps 命令与 grep 同时执行。

  • ps -ef | grep java 表示查询包含 “java” 的所有进程

4.3.3 kill 命令

  • Linux kill 命令用于删除执行中的程序或工作。

  • kill 可将指定的信息送至程序。预设的信息为 SIGTERM(15),可将指定程序终止。

  • 若仍无法终止该程序,可使用 SIGKILL(9) 信息尝试强制删除程序。

  • 程序或工作的编号可利用 ps 指令或 jobs 指令查看。

5、文本注释

  • 文本注释

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    // I am a single line comment!

    /*
    And I am a
    multi-line comment!
    */

    /**
    * This
    * is
    * documentation
    * comment
    */

6、关键字

  • 关键字列表

7、开发工具

  • Java 语言开发尽量保证系统内存在 1G 以上。

  • Linux 系统或者 Windows 95/98/2000/XP,WIN 7/8/10/11 系统。

  • Java JDK 8 及以上版本。

  • Notepad 编辑器或者其他编辑器。

  • IDE:Eclipse 或者 Intellij IDEA

  • 相关软件和工具

8、Java 学习资源

9、Java 面试问题

文章目录
  1. 1. 前言
  2. 2. 1、Java
  3. 3. 2、JDK 环境配置
    1. 3.1. 2.1 JDK 和 JRE
    2. 3.2. 2.2 环境配置
  4. 4. 3、Java API
    1. 4.1. 3.1 JDK 11
    2. 4.2. 3.2 JDK 1.8
  5. 5. 4、Java 程序
    1. 5.1. 4.1 实例
    2. 5.2. 4.2 命令行编译运行
    3. 5.3. 4.3 服务部署
      1. 5.3.1. 4.3.1 nohup 命令
      2. 5.3.2. 4.3.2 ps、grep 命令
      3. 5.3.3. 4.3.3 kill 命令
  6. 6. 5、文本注释
  7. 7. 6、关键字
  8. 8. 7、开发工具
  9. 9. 8、Java 学习资源
  10. 10. 9、Java 面试问题
隐藏目录