今年秋季业余专升本里开了个JAVA的专业课,不过说实话,老师的水平感觉比较一般。
而且鉴于我们这种性质嘛,老师也不太用心的教 ¯_(ツ)_/¯
老师自己也直言不是专门潜心研究编程方向的,但是老师对于很对底层的细节了解的还是比较多,而且讲课时经常给我们讲某某范畴的知识属于哪门课,让我们都可以去学习。
这里就摘录一下部分学习的资料。因为我是已经写了将近五年的C#,多以可能会删去一些过于基础的东西。只保留一些概念性的东西。

Java的历史与发展

Java平台和语言最开始只是Sun Microsystems公司(简称 Sun公司)在1990年12月开始研究的一个内部项目。
Sun公司的一个叫做帕特里克·诺顿的工程师被Sun自己开发的C++和C语言编译器搞得焦头烂额,因为其中的API极其难用。帕特里克决定改用NeXT,同时他也获得了研究公司的一个叫做“Stealth 计划”的项目的机会。
“Stealth 计划”后来改名为“Green计划”,詹姆斯·高斯林和麦克·舍林丹也加入了 帕特里克的工作小组。
他们和其他几个工程师一起在加利福尼亚州门罗帕克市沙丘路的一个 小工作室里面研究开发新技术,瞄准下一代智能家电(如微波炉)的程序设计,Sun公司预 料未来科技将在家用电器领域大显身手。
团队最初考虑使用C语言,但是很多成员包括Sun 的首席科学家比尔·乔伊,发现C和可用的API在某些方面存在很大问题。
工作小组使用的是内嵌类型平台,可以用的资源极其有限。
很多成员发现C太复杂以至 很多开发者经常错误使用。他们发现C缺少垃圾回收系统,还有可移植的安全性、分布程序设计、和多线程功能。最后,他们想要一种易于移植到各种设备上的平台。
根据可用的资金,比尔·乔伊决定开发一种集C语言和Mesa语言大成的新语言,在一份报告上,乔伊把它叫做“未来”,他提议Sun公司的工程师应该在C的基础上,开发一种面向对象的环境。
最初,高斯林试图修改和扩展C的功能,他自己称这种新语言为 C++ ++ —, 但是后来他放弃了。他将要创造出一种全新的语言,被他命名为“Oak”(橡树),以他的办公室外的树而命名。
就像很多开发新技术的秘密的工程一样,工作小组没日没夜地工作到了1992年的夏天,他们能够演示新平台的一部分了,包括Green操作系统,Oak的程序设计语言,类库,和其硬件 。
最初的尝试是面向一种类PDA设备,被命名为Star7,这种设备有鲜艳的图形界面和被称为 “Duke”的智能代理来帮助用户。1992年12月3日,这台设备进行了展示。
同年11月,Green计划被转化成了“FirstPerson有限公司”,一个Sun公司的全资子公司,团队也被重新安排到了帕洛阿尔托。FirstPerson团队对建造一种高度互动的设备感兴趣,当时代华纳发布了一个关于电视机顶盒的征求提议书时(Request for proposal), FirstPerson改变了他们的目标,作为对征求意见书的响应,提出了一个机顶盒平台的提议 。但是有线电视业界觉得FirstPerson的平台给予用户过多地控制权,因此FirstPerson的投标败给了SGI。与3DO公司的另外一笔关于机顶盒的交易也没有成功,由于他们的平台不能在 电视工业产生任何效益,公司又并回Sun公司。

1994年6月、7月间,在经历了一场历时三天的脑力激荡的讨论后,
约翰·盖吉、詹姆斯·高斯林、比尔·乔伊、帕特里克·诺顿、韦恩·罗斯因和埃里克·斯库米,团队决定再一次改变了努力的目标,这次他们决定将该技术应用于万维网。
他们认为随着Mosaic浏览器的到来,因特网正在向同样的高度互动的远景演变,而这一远景正是他们在有线电视网中看到的 。
作为原型,帕特里克·诺顿写了一个小型万维网浏览器,Web Runner,后来改名为Hot Java 。同年,Oak改名为Java。商标搜索显示,Oak已被一家显卡制造商注册,因此团队找到了一个新名字。这个名字是在很多成员常去的本地咖啡馆中杜撰出来的。名字是不是首字母缩写还不清楚,很大程度上来说不是。虽然有人声称是开发人员名字的组合:James Gosling(詹姆斯·高斯林)Arthur Van Hoff(阿瑟·凡·霍夫)Andy Bechtolsheim(安迪·贝克托克姆),或“Just Another Vague Acronym”(只是另外一个含糊的缩写)。
还有一种比较可信的说法是这个名字是出于对咖啡的喜爱,所以以Java咖啡来命名。类文件的前四个字节如果用十六进制阅读的话,分别为“CA FE BA BE”,就会拼出两个单词“CAFE BABE”(咖啡宝贝)。
Java是印度尼西亚爪哇岛的英文名称,因盛产咖啡而闻名。其中许多库类名称多与咖啡有关,如JavaBeans(咖啡豆)、NetBeans(网络豆)及ObjectBeans(对象豆),等等。它的表示也正是一杯正冒着热气的咖啡。

Java的三个版本

Java SE:Java SE的全称是 Java Platform Standard Edition(Java平台标准版),是Java技术的核心,主要用于桌面应用程序的开发。
Java EE:Java EE的全称是 Java Platform Enterprise Edition(Java平台企业版),用于网络程序和企业级应用的开发。
Java ME:Java ME的全称是 Java Platform Micro Edition(Java平台微型版),主要用于手机游戏、PDA、机顶盒等消费类设备和嵌入式设备中。

任何Java学习者都需要从JavaSE开始入门, JavaSE是Java语言的核心,而JavaEE是在JavaSE的基础上扩展的。

Java语言特点

  1. Java语言是简单的:Java去掉了C和C++中的多继承、指针和内存管理等。Java提供了自动的“垃圾”回收机制,使得程序员不必为内存管理而担忧。Java的简单性减低学习的难度。
  2. Java语言是面向对象的。
  3. Java语言是分布式的:Java从诞生就与网络联系在一起,Java的主要优点是面向网络的编程,Java支持网络应用程序的编程,使其成为一种分布式程序设计语言。
  4. Java语言是健壮的:编译和执行过程中进行严格的语法检查,以减少错误的发生。利用自动“垃圾”回收机制管理内存,防止程序员在管理内存时产生错误。使用异常处理机制捕获并响应异常情况,从而使程序在发生异常的时候能够继续运行。
  5. Java语言是安全的:Java通常被用在网络环境中。为此,Java提供了一个安全机制以防止恶意代码的攻击。
  6. Java语言是体系结构独立的:Java源代码不会针对一个特定平台进行编译,而是被转换成一种中间格式,字节码与体系结构无关,可以在任何有Java虚拟机(JVM)的计算机上运行,而Java虚拟机与平台相关。
  7. Java语言是可移植的:这种可移植性来源于体系结构独立性,另外,Java语言设计目标就是让程序不用修改就可以在任何平台上运行。
  8. Java语言是解释型的:先编译成字节码指令,然后又JVM解释成本地指令执行。解释执行比编译执行(如C/C++程序)执行效率低。
  9. Java是高性能的:为了提高运行速度,Java语言提供一种即时编译JIT(Just-In-Time)编译器技术,随着JIT编译器技术的发展,Java程序执行速度越来越接近于C++。
  10. Java语言是多线程的:多线程是指在一个程序中可以运行多个任务。C和C++采用单线程体系结构,而Java语言支持多线程技术。采用多线程能够提高程序运行效率,发挥硬件资源,但同时也增加了程序的设计难度。
  11. Java语言是动态的:Java语言的设计目标之一是适应于动态变化的环境。Java程序需要的类能够动态地被载入到运行环境,也可以通过网络来载入所需要的类,这也有利于软件的升级。

这里真正与C#有差异的地方是第九条 JIT,在Net平台未听说过此类技术。 后经查询找到 https://www.cnblogs.com/kklldog/p/net-java-jit-different.html 可见这个层面二者一致。 以及第七条,JAVA是真正意义上的跨平台语言。当然随着Net6的发展,C#也会逐渐的跨平台,但时间,框架,库,以及开发者群体却是一去不复返的。

其实就我个人而言,觉得JAVA对于普通开发者的好处是生态非常繁荣,而Net平台的知名类库可能几百个就不错了,很多用途的类库往往没得选,因为能看的只有一个。 还有一种区别是JAVA的API要比Net的API细粒度的多,这从语言的层面来讲,当然是要优秀一些的。

Java程序分类

应用程序(Java Application)可以单独运行,可以完成各种计算任务。
小程序(Applet)

  • 不能单独运行,只能在与 Java 兼容的容器(运行环境)中运行
  • 有两类小程序
    Applet:运行在浏览器端,嵌入到网页中,当网页被浏览时,在浏览器中运行。Applet 程序的主要作用是使得网页更加生动,或者使网页具有更好的交互性。
    Servlet:“Serv”表示“服务器端”,即在服务器端运行。后缀-let表示“小,微小,在…佩戴的小饰物之意”,即是“服务器端运行的Java小程序”。Servlet用于拓展服务器功能。

Java源程序的字符编码

Windows上用文本编辑器编辑源程序保存文件时选用ANSI编码。
ANSI编码标准就是一个“帽子”,在这个“帽子”下,不同的国家和地区制定了不同的标准。
不同版本的操作的ANSI标准是本地化的字符编码标准,
在简体中文Windows操作系统中,ANSI 编码代表 GBK 编码;
在繁体中文Windows操作系统中,ANSI编码代表Big5;
在日文Windows操作系统中,ANSI 编码代表 Shift_JIS 编码。
当我们编辑了一个Java源文件保存时,是以操作系统默认的字符编码保存的(简体中文Windows默认字符集是GBK)。

当调用javac命令时,会把源文件进行一次编码转换,如果没有指定字符集,就从操作系统默认的字符集转换成Java内部默认的Unicode字符集,然后再将源文件编译成class文件,并且以Unicode的编码形式保存到硬盘上。这就是为什么我们在Windows上用文本编辑器编辑源程序保存文件时选用ANSI编码的道理。
如果你在保存文件直接选用UTF-8(无BOM)字符编码方式,则需要明确告诉javac你的源文件是用UTF-8(无BOM)格式编码的,否则javac还是把你的这个源文件当操作系统默认编码,然后做转换,转换之后就可能出现“乱码”了。

告诉javac你的源文件用何种字符编码的方法是使用-encoding选项,如:
javac -encoding utf8 A.java
如果有.jar引用,就
javac -encoding utf8 -classpath a.jar;b.jar A.java;
源文件选用UTF-8(无BOM)时,在Windows和linux下都能比较好地通过编译。

Windows上用文本编辑器编辑Java源程序,保存是选用ANSI编码方案(就是本地操作系统默认编码方案)保存,编译直接用Javac命令,编译器自动完成本地操作系统到Unicode字符集的转换;保存文件是时如果用UTF-8方案,则用javac编译时使用-encoding选项指明源文件字符编码方式。
无论是通用文本编辑器,还是专用代码编辑器,亦或是集成开发环境中的文本编辑器,你在使用它们时都可以指定保存文件的字符编码。指定方法各有不同,使用时查阅相关工具的文档即可。

Java 体系结构概览

Java SE Development Kit 8 Documentation对Java SE体系结构做了清晰的介绍,如图所示。
image.png
这个图虽然比较详细,但是不容易理解。为了便于理解,我们介绍一种简化的体系结构。这里认为完整的Java体系结构包括四个组件:

  • Java编程语言
  • Java类文件格式
  • Java应用程序编程接口(API, Application Programming Interfaces)
  • Java虚拟机

它们之间的关系如图所示。
image.png
Java虚拟机(JVM)与核心类(API)的组合形成Java平台,也称Java运行时环境(JRE, Java Runtime Environment),位于所用的操作系统平台之上。
Java类文件和Java编程语言组成了Java应用程序。Java应用程序运行在Java运行时环境之上。我们编程人员要完成的工作是用Java编程语言编写应用程序。
在编写应用程序的时候可能会调用Java核心类(API)或者Java扩展类库中的文件。
另外,JRE与操作系统之间有本地方法。本地方法是连接Java虚拟机(JVM)和真实系统的关口,它提供对资源的访问,如网络、视窗系统和主机文件系统等。
它是在主机平台上用本地编译语言(如 C/C++ 等)实现的。
需要注意的是,在实际的 Java 平台中,核心类和支持文件(JRE)与Java虚拟机(JVM)通常实现为不同的实体。
考虑一种常见的情况:当我们在 Windows 系统平台上用 JDK 开发 Java 程序的时候,会用解释器 Java.exe 去执行 Java Application 程序。此时,当我们用启动这个Java解释器的时候,实际上会同时启动了JVM和JRE。

Java 虚拟机(JVM)

Java 源程序经过编译后生成二进制形式的字节码文件需要由 Java 虚拟机(JVM)去执行, JVM 是执行 Java 程序的引擎。
我们可以认为 JVM 是在一台计算机上由软件模拟,也可用硬件实现的假想的计算机,它定义了指令集(相当于中央处理器 CPU)、寄存器、类文件结构栈、垃圾收集堆、内存区域等。而 Java 程序编译后得到的二进制形式的字节码实际上就是JVM指令。
通常见到的 JVM 是在主机操作系统上由软件实现的,在这中情况下, JVM 实际上是操作系统平台上的用本地语言(如C/C++等)编写的一个程序。JVM 在运行的时候会有如图1.7所示的结构:
image.png
这里, Java 虚拟机是主机操作系统上运行的一个程序,它主要包括两个模块,一个是类装载器,一个是执行引擎。
类装载器负责加载应用程序的类文件和 Java API 的类文件。执行引擎负责执行类装载器装载进来的字节码指令和数据。
Java 字节码文件中的指令格式和数据格式都是专有的,与本地主机系统平台的指令格式或数据格式往往不相同,因而这样的二进制形式的文件不能直接驱动本地主机系统工作,执行引擎的功能就是把 Java 的字节码文件中的指令和数据转换成本地主机系统能够识别的指令和数据的格式,然后把它交给本地主机系统去执行。当然,如果需要的话,执行引擎在程序执行过程中有可能会调用本地方法访问主机操作系统资源。这里的本地方法,往往就是用本地语言(如 C/C++ 等)编写的动态链接库。
这里要注意的是,当 JVM 是在主机操作系统上由软件实现时, JVM 实际上是用 C/C++ 之类的本地语言编写的程序。
这个 JVM 程序是和具体的主机平台相关的,不同的系统平台需要安装不同版本的虚拟机程序。

Java 虚拟机内部结构

image.png
这个图说明了Java虚拟机内部体系结构:

  • 每个Java虚拟机都有一个类装载子系统,它根据给定的全限定名来装入类型,这里的类型是指程序中的类和接口。
  • 同样,每个Java虚拟机都有一个执行引擎,它负责执行那些,包含在被装载类的方法中的指令。
  • 每个Java虚拟机还有它自己管理的内存区域,称为运行时数据区。为方便管理,虚拟机把运行时数据区分成了几个部分分别是方法区、堆区、Java栈区、PC寄存器区、和本地方法栈区。

它的工作机制大致是这样的:

  • 类装载器读入class文件,也就是类的字节码文件,然后将它构建到运行时数据区中。执行引擎由类创建对象的时候是根据已装载的类,在运行时数据区创建对象本体。
  • 执行引擎是JVM执行Java字节码指令的核心,它通过本地方法接口和本地方法库与底层的主机平台交互。
  • JVM的指令集是基于栈而非寄存器的。
  • 执行引擎执行字节码指令标准的执行方式是解释执行,即读取一条字节码指令,翻译成本地主机指令,交给本地主机去执行,然后紧接着用类似的方式处理下一条字节码指令,依次下去。早期都是解释执行,后来为了提交效率,也使用编译执行,也就是做了个即时编译器JIT(Just-In-Time),在运行时进行编译,它会在第一次执行时编译字节码为机器码并缓存,之后就可以重复利用。但即时编译不是必须的。

Java程序执行时可能产生多个执行引擎实例:

  • Java把Java栈和PC寄存器设计成线程私有的,线程之间无法互相干涉彼此的栈;每个线程拥有独立的JVM执行引擎实例。

执行引擎实例可能会有多个,Java的每个线程拥有独立的JVM执行引擎实例。
Java把Java栈和PC寄存器设计成线程私有的,线程之间无法互相干涉彼此的栈和PC寄存器。
不同运行时数据区有不同的用途,如图1.9所示。
image.png
图1.9 Java 运行时数据区
类代码会加载到方法区,而由类创建的对象,则会放在堆区。
我们可以不是很严谨的说:类在方法区构建;对象在堆区构建。

Java 的平台无关性

通常说的 Java 程序的平台无关性是指我们在把 Java 源程序编译成字节码文件之后,这个字节码文件可以放到任何的系统平台上的 JVM 上运行。
Java 程序平台无关,而 JVM 平台相关。下面的图1.10说明了这个问题。
image.png
每个 JVM 都必须能够执行字节码,不管用何种方式实现的 JVM 都要满足这个要求,这样才能满足“一次编译,到处运行”的可移植性。不难想象, JVM的功能必须经过严格定义才行。
JVM 功能的严格定义是由 JVM 规范(JVM specification)规定的,这个规范由 Sun 公司开发和控制(当然,Sun被Oracle收购后,自然由Oracle规定和控制了)。
JVM 规范主要是确定 Java 虚拟机所能认识的字节码格式和 Java 虚拟机要实现的特性和功能,但 JVM 规范并不对实现细节做过多的规定。
任何人用任何方式实现的 JVM都应该满足这个规范。引申来说,任何人都可以写个程序来实现 JVM,只要这个程序复合 JVM 规范就成,它就可以执行 Java 程序。

Java API / Java 类文件

有编程经验的人都知道,实际上,编程语言本身提供的功能往往是很有限的,很多常用功能往往是通过应用程序编程接口(API)来提供的, Java 也是这样的。
Java 应用程序编程接口(API, Application Programming Interface)是预先编好的代码,这些代码能够完成常用的功能,比如数据的输入输出、图形用户界面编程等等。
Java API 的代码以类和接口的形式组成类似主题的包,供我们编程使用。下面的列出了一些常用的系统包:

Java API 包 功能
java.applet 提供对通用 Applet 的支持,是所有 Applet 的基类
java.awt 提供组建标准图形用户界面(GUI)的系统类。包含了众多的图形组件、方法和事件
java.lang 包含 Java 语言的核心类库
java.net 实现 Java 网络功能的类库
java.io 包含输入输出类
java.security 支持 Java 程序安全性
java.util 提供各种实用工具类

Java API 是Java 编程的基础结构之一,是 Java 平台的一个组成部分(如前所述,Java API 和 JVM 共同组成了 Java 运行时环境,也称 Java 平台),任何实现 Java 平台的人或组织都要给出 Java API 的具体实现。
具体用什么办法得到 Java API 由实现 Java 平台的人去决定,最终的二进制代码只要符合 JVM 规范就成。
由此可见, Java API 的类文件天生就与主机平台密切相关,不同的主机平台上的 Java API文件是不同的,但是完成的功能却是相同的。
正是由于在每个特定的主机平台上明确地实现了 Java 虚拟机和 Java API,才使得 Java 程序本身能够具有平台无关性。
在实际运行 Java 程序时,虚拟机装载程序的类文件和所使用的 Java API 类文件。
所有被装载的类文件(包括从应用程序中和从 Java API 中提取的)和所有已经装载的动态链接库(包含本地方法)共同组成了在 Java 虚拟机上运行的整个程序。

运行环境与开发环境

JDK

JDK 的全称是Java SE Development Kit,即Java标准版开发包,是Java官方提供的用于开发Java应用程序的开发包。
JDK提供了什么?

  • 开发Java程序所需的各种工具(诸如Java编译器、Java虚拟机等程序)和资源;
  • 也提供了运行Java程序的Java运行时环境。

    JDK的下载、安装和配置

  1. 登录Java官网:http://www.oracle.com/technetwork/java/index.htm,选择“Downloads/Java SE”,在新页面中选择“Java Platform (JDK) 8u91 / 8u92”下载JDK,在新页面中选择“Accept License Agreement”,选择相应主机平台上的JDK安装程序下载。
  2. 下载JDK8。下载过程中需要注册Oracle账户。
  3. 安装JDK8。解释安装选项的含义。
  4. 设置环境变量。
  • 使用控制面板配置环境变量:控制面板\系统和安全\系统,左侧的选项列表中选择“高级系统设置”,打开“系统属性”对话框,在“高级”标签页中选择“环境变量”,在弹出的“环境变量”对话框中设置系统环境变量。
  • 配置JAVA_HOME、Path、CLASSPATH。
  • Set JAVA_HOME= C:\Program Files\Java\jdk1.8.0_162
  • Set Path=%Path%; C:\Program Files\Java\jdk1.8.0_162\bin
  • Set CLASSPATH=.;
  1. 测试安装及配置。
  • 若要打开「开始」菜单,请单击屏幕左下角的「开始」按钮。
  • 左边窗格的底部是搜索框,通过键入搜索项可在计算机上查找程序和文件。
  • 在搜索框中键入命令:cmd,然后按“Enter”键,打开命令提示符窗口。
  • 在命令提示符窗口中输入:
    set,然后回车,查看环境变量的设置是否正常。
    javac,然后回车,根据结果判断安装、配置是否正常。

在搜索框中键入命令:cmd,然后按“Enter”键,打开命令提示符窗口
Set JAVA_HOME Set Path Set CLASSPATH javac -version java -version

Java的环境变量

环境变量是进程运行环境的一部分,它影响进程运行方式。
环境变量一般特指在操作系统中设置的变量。

  • 通常,操作系统是进程的运行环境,设置环境变量就是在操作系统中设置变量。
  • 环境变量最早是1979年在第七版的Unix操作系统中引入的,后来DOS、Windows、Linux、macOS也都引入了环境变量的概念。

Java的环境变量就是为支持Java程序的运行,在操作系统中设置的一些变量。
通常会设置Java的环境变量,但不是必须的。

开发Java程序时的环境变量设置

JAVA_HOME

  • 其值是JDK安装路径。
  • 用于表明Java开发工具(JDK)安装在哪个目录下了。
  • 有些应用可能会用这个JAVA_HOME,一般安装JDK的时候就直接设置好,以后开发会方便一些。

Path

  • 其值是一系列路径,Windows系统路径之间用分号(;)隔开。
  • 用设置JDK命令搜索路径。
  • 告诉操作系统,当要运行的JDK提供的工具程序没在当前目录时,到Path包含的路径中去寻找相应的工具程序。

CLASSPATH

  • 其值是一系列路径
    • Windows系统路径之间用分号(;)隔开
    • 用点(.)表示当前路径
  • 告诉Java执行环境,在哪些目录下可以找到你所要执行的Java程序所需要的类或者包
  • JVM和其它JDK工具通过依次搜索平台库、库扩展和类路径来查找类
  • 当你的程序使用第三方类时,往往需要把第三方类的jar文件路径加到CLASSPATH中
    • 如果不加到CLASSPATH中,就把那个jar文件复制到JRE的库扩展路径(如C:\Program Files\Java\jre1.8.0_121\lib\ext)下。
  • 当编译或执行Java程序时可能会遇到类似“java.lang.ClassNotFoundException:ClassName.class”的错误,这时就要检查CLASSPATH环境变量的设置是否合适,确保JVM或JDK工具能够找到Java程序中引用的类包

环境变量设置样例

  • Set JAVA_HOME= C:\Program Files\Java\jdk1.8.0_162
  • Set Path=%Path%; C:\Program Files\Java\jdk1.8.0_162\bin
  • Set CLASSPATH=.;

“%…%“这对儿百分号表示引用原来Path的值

Java解释器和其它命令行工具都知道如何找到核心(core)类,它们在安装时都会包括进去。这些类不必包含在类路径CLASSPATH中,Java解释器和其它工具都可以自动找到它们。
多数应用程序的类库都会充分利用扩展机制,因此,只有想要加载的某个类库没有在当前目录或其分包中,并且不在扩展机制所指定的位置时,才需要设置类路径。
如果你设置了CLASSPATH,则一定要记得把表示当前目录的点(.)加到CLASSPATH中,因为一旦设置了CLASSPATH,JRE就按CLASSPATH搜索,就不默认搜索当前目录了。

使用第三方类的例子

编写一个输出日志信息的程序

  • 程序用Apache通用日志工具Commons-Logging 输出一些日志信息到控制台。
  • 这个工具的代码在commons-logging.jar归档文件中,不是Java平台的系统类库,而是第三方类库。
  • 程序开发分两步:
    • 先得到这个工具的Jar包,并把它保存的某个目录下
    •  然后在程序中使用包中的代码,完成输出日志信息的功能

源程序代码如下:

  1. import org.apache.commons.logging.Log;
  2. import org.apache.commons.logging.LogFactory;
  3. public class LogTest {
  4. public static void main(String[] args) {
  5. Log logger = LogFactory.getLog(LogTest.class);
  6. logger.debug("DUBUG调试信息");
  7. logger.info("INFO信息");
  8. logger.warn("WARN信息");
  9. logger.error("ERROR信息");
  10. logger.fatal("FATAL信息");
  11. }
  12. }

代码分析:
源程序中用到的Log和LogFactory都是第三方类库commons-logging-1.2.jar中的类,而这个commons-logging-1.2.jar不是Java平台提供的类库,而是第三方提供的类库。
默认情况下,JVM和JDK工具是找不到这个第三方类库的。

设置类路径

如果不设置类路径,默认情况下,JVM和JDK工具是找不到commons-logging-1.2.jar,无法使用Log和LogFactory,因此编译时会出错。
错误提示信息说程序中要用的第三方的Apache Commons Logging API包不存在,也就是编译器找不到那个包。
我们得告诉javac到哪里才能找到第三方类库,这样才能通过编译。可以通过设置CLASSPATH环境变量的方式告诉javac到哪里找到第三方了。
Set CLASSPATH=%CLASSPATH%; D:\LearningJava\lib\commons-logging-1.2.jar
看一下CLASSPATH的值:
Set CLASSPATH
没问题。此时JDK工具和JRE就都能找到此jar文件了。

这种方法必然不太好,相当于是走系统变量去寻找引用类或包。理想的情况肯定是基于项目文件管理工具去添加引用。

要让JRE找到第三方类库,可以用设置CLASSPATH的方法,也可以不设置CLASSPATH
1.把commons-logging-1.2.jar复制到C:\Program Files\Java\jdk1.8.0_162\jre\lib\ext。
此时JDK工具能找到此jar文件,用javac可以编译源程序没问题,但JRE找不到jar文件,你还没法运行程序。
2.再把commons-logging-1.2.jar复制到C:\Program Files\Java\jre1.8.0_162\lib\ext此时JDK工具能找到此jar文件,此时JRE也能找到jar文件了,你可以正常运行程序。
Tips:
C:\Program Files\Java\jdk1.8.0_162\jre\lib\ext是JDK工具的库扩展路径;
C:\Program Files\Java\jre1.8.0_162\lib\ext是JRE的库扩展路径。
你把第三方库文件放到库扩展路径中,此时就可以不用设置CLASSPTH环境变量,因为“JVM和其它JDK工具通过依次搜索平台库、库扩展和类路径来查找类”。

部署Java程序的两种最根本的方法

部署Java程序的两种最根本的方法

  • 把需要的jar文件放到某个目录,然后设置CLASSPATH
  • 把需要的jar文件放到JRE和/或JDK的库扩展路径下

Tips:
可能很多人会告诉你在集成开发环境中引入jar包、部署Java程序等的一堆步骤,但实际开发Java程序的时候,那些东西都不重要,有没有都没什么关系。

显然,老师觉得那个东西对于初学者来说有些多余。类似 Maven 之类的东西。

Eclipse

此处的东西不再赘述。
此处仅记录一些快捷键。
定位:行末/行首:End/Home
注释或取消注释:Control+/: 对一行注释或取消注释。对于多行也同样适用。
代码助手:Ctrl+Space(简体中文操作系统是Alt+/)
快速修正:Ctrl+1
导入类:ctrl+shift+o:为当前行中尚未引入的类自动添加import语句导入。
快速复制一行:

  • 将光标放到某一行,按住Ctrl+Alt+Down,即可以在下面快速复制一行,按住Ctrl+Alt+Up,即可以在上面快速复制一行。
  • 这里有一点需要注意:intel的显示器,其显示方向的快捷键也是Ctrl+Alt+方向键,而且其响应的优先级比较高。这个时候你需要找到显示器设置的地方,去关闭快捷键响应。如果不好找的话,也可以修改eclipse的快捷键。

重命名:用快捷键alt+shift+r,就可以很快速地把所有名字都重新命名。