原文出处：JavaSE由浅入深
作者：erlian1992

本系列文章经作者授权在看云整理发布，未经作者允许，请勿转载！

JavaSE由浅入深

JavaSE是Java的一个基础部分，只有掌握了它，才能向着JavaEE和JavaME发展，去做网站设计和Android开发。从基础开始，由浅入深，循序渐进，做好点滴积累。

一计算机概述

计算机(Computer)全称：电子计算机，俗称电脑。是一种能够按照程序运行，自动、高速处理海量数据的现代化

智能电子设备。由硬件和软件所组成，没有安装任何软件的计算机称为裸机。常见的形式有台式计算机、笔记本计算

机、大型计算机等。

二计算机应用

计算机的应用已渗透到社会的各个领域，正在改变着人们的工作、学习和生活的方式，推动着社会的发展。归纳

一下，计算机的应用主要在以下几个方面：

(1)科学计算

科学计算也称数值计算。计算机最开始是为解决科学研究和工程设计中遇到的大量数学问题的数值计算而研制的

计算工具。例如，人造卫星轨迹的计算，房屋抗震强度的计算，火箭、宇宙飞船的研究设计都离不开计算机的精确计

算。就连我们每天收听收看的天气预报都离不开计算机的科学计算。

(2)数据处理

在科学研究和工程技术中，会得到大量的原始数据，其中包括大量图片、文字、声音等信息处理就是对数据进行

收集、分类、排序、存储、计算、传输、制表等操作。

(3)自动控制

自动控制是指通过计算机对某一过程进行自动操作，它不需人工干预，能按人预定的目标和预定的状态进行过程

控制。例如，无人驾驶飞机、导弹、人造卫星和宇宙飞船等飞行器的控制，都是靠计算机实现的。

(4)计算机辅助设计

计算机辅助设计(Computer Aided Design，简称CAD)是指。借助计算机的帮助，人们可以自动或半自动地完成各

类工程设计工作。目前CAD技术已应用于飞机设计、船舶设计、建筑设计、机械设计、大规模集成电路设计等。在京

九铁路的勘测设计中，使用计算机辅助设计系统绘制一张图纸仅需几个小时，而过去人工完成同样工作则要一周甚至

更长时间。可见采用计算机辅助设计，可缩短设计时间，提高工作效率，节省人力、物力和财力，更重要的是提高了

设计质量。

(5)人工智能

人工智能(Artificial Intelligence，简称AI)是指计算机模拟人类某些智力行为的理论、技术和应用。例如，用计算机

模拟人脑的部分功能进行思维学习、推理、联想和决策，使计算机具有一定“思维能力”。我国已开发成功一些中医专

家诊断系统，可以模拟名医给患者诊病开方。 还有就是机器人也是计算机人工智能的典型例子。

(6)多媒体应用

随着电子技术特别是通信和计算机技术的发展，人们已经有能力把文本、音频、视频、动画、图形和图像等各种

媒体综合起来，构成一种全新的概念—“多媒体”(Multimedia)。比如一些flash广告，网页游戏等。

(7)计算机网络

计算机网络是由一些独立的和具备信息交换能力的计算机互联构成，以实现资源共享的系统。如在全国范围内的

银行信用卡的使用，火车和飞机票系统的使用等。

三计算机硬件

计算机硬件(Computer Hardware)是指计算机系统中由电子，机械和光电元件等组成的各种物理装置的总称。这些

物理装置按系统结构的要求构成一个有机整体为计算机软件运行提供物质基础。计算机通常由CPU、主板、内存、电

源、主机箱、硬盘、显卡、键盘、鼠标，显示器等多个部件组成。这里就不再详细的介绍各个硬件，在我的一篇博文

中已经有过介绍，可以参考：计算机基础之透析我家的组装机。

四计算机软件

计算机软件是使用计算机过程中必不可少的东西，计算机软件可以使计算机按照事先预定好的顺序完成特定的功

能，计算机软件按照其功能划分为系统软件与应用软件。

(1)系统软件：DOS，Windows，Linux，Unix，iOS，Android，Mac。

(2)应用软件：office，QQ，YY语音，扫雷等。

五软件开发

(1)软件

按照特定顺序组织的计算机数据和指令的集合。

(2)开发

软件的制作过程。

(3)软件开发

借助开发工具与计算机语言制作软件。

六计算机语言

(1)语言

人类进行沟通交流的各种表达符号，方便人与人之间进行沟通与信息交换、

(2)计算机语言

人与计算机之间进行信息交流沟通的一种特殊语言。

计算机语言中也有字符，符号等等。

常见的计算机语言如C,C++,C#,Java。

(3)计算机语言的发展

机器语言——汇编语言——高级程序语言

计算机软件都是用各种计算机语言编写的。最底层的叫机器语言，它由一些0和1组成，可以被某种电脑直接理

解，但人就很难理解。上面一层叫汇编语言，它只能由某种电脑的汇编器软件翻译成机器语言程序，才能执行。人能

够勉强理解汇编语言。人常用的语言是更上一层的高级语言，比如C，C++，C#， Java等。这些语言编写的程序一般

都能在多种电脑上运行，但必须先由一个叫作编译器或者是解释器的软件将高级语言程序翻译成特定的机器语言程

序。

七人机交互

软件的出现实现了人与计算机之间更好的交互。常见的交互方式有两种：

(1)图形化界面：这种方式简单直观，使用者易于接受，容易上手操作。

(2)命令行方式：需要有一个控制台，输入特定的指令，让计算机完成一些操作。较为麻烦，需要记住一些命令。

八键盘功能键

Tab

Shift

Ctrl

Alt

Enter

空格

Window

PrtSc：屏幕截图

九键盘快捷键

Ctrl+A 全选

Ctrl+C 复制

Ctrl+V 粘贴

Ctrl+X 剪切

Ctrl+Z 撤销

Ctrl+S 保存

先要了解更多的快捷键用法，可以参考：快捷键用法。

十DOS(重点)

(1)打开DOS控制台的方式

1)开始——所有程序——附件——命令行提示符

2)开始——运行——cmd——回车

3)Window+R——cmd——回车

4)Shift+鼠标右键——在此处打开命令窗口(Win7)

(2)常用DOS命令

1)盘符:Enter(回车)：盘符切换(如：d:enter)

2)dir(directory):列出当前目录(文件夹，下同)下的文件以及文件夹

3)md(make directory): 创建目录

4)rd(remove directory): 删除目录(带目录的文件夹不能直接删除)

5)cd(change directory)：(改变指定目录)进入指定目录

6)cd.. : 退回到上一级目录

7)cd\: 退回到根目录

8)del(delete): 删除文件,删除一堆后缀名一样的文件*.txt

9)cls : (clear screen)清屏

10)exit : 退出dos命令行

(3)命令拓展

11)notepad：打开记事本

12)rd /s：直接删除带内容目录(带Y/N提示)

13)rd /s /q ：直接删除带内容目录

14)进入目录

单级进入：cd 文件夹

多级进入：cd 文件夹\文件夹\文件夹...

15)回退目录

单级回退：cd..

多级回退：cd\

16)删除文件

删除单个文件：例如：del a.txt

删除多个文件：例如：del *.txt

(4)扩充内容

目录中的exe文件可以直接使用其名称执行该命令(后面我们可以尝试)

调整DOS界面显示内容数量

关于学习JavaSE语言的准备工作先学习到这里。

一Java语言概述

Java是一种可以撰写跨平台应用程序的面向对象的程序设计语言。Java 技术具有卓越的通用性、高效性、平台

移植性和安全性，广泛应用于PC、数据中心、游戏控制台、科学超级计算机、移动电话和互联网，同时拥有全球最大

的开发者专业社群。

Java由四方面组成：

(1)Java编程语言，即语法。

(2)Java文件格式，即各种文件夹、文件的后缀。

(3)Java虚拟机(JVM)，即处理*.class文件的解释器。

(4)Java应用程序接口(Java API)。

二Java语言平台版本

JavaSE(Java 2 Platform Standard Edition)标准版

是为开发普通桌面和商务应用程序提供的解决方案。该技术体系是其他两者的基础，可以完成一些桌面应用程序

的开发。

JavaME(Java 2 Platform Micro Edition)小型版

是为开发电子消费产品和嵌入式设备提供的解决方案。

JavaEE(Java 2 Platform Enterprise Edition)企业版

是为开发企业环境下的应用程序提供的一套解决方案。该技术体系中包含的技术如 Servlet、Jsp等，主要针对于

Web应用程序开发。

三Java语言特点

(1)简单性

Java语言是一种面向对象的语言,它通过提供最基本的方法来完成指定的任务,只需理解一些基本的概念,就可以用

它编写出适合于各种情况的应用程序。Java略去了运算符重载、多重继承等模糊的概念,并且通过实现自动垃圾收集大

大简化了程序设计者的内存管理工作。

(2)面向对象

Java语言的设计集中于对象及其接口,它提供了简单的类机制以及动态的接口模型。对象中封装了它的状态变量以

及相应的方法,实现了模块化和信息隐藏;而类则提供了一类对象的原型,并且通过继承机制,子类可以使用父类所提供的

方法,实现了代码的复用。

(3)分布式处理

Java是面向网络的语言。通过它提供的类库可以处理TCP/IP协议,用户可以通过URL地址在网络上很方便地访问其

它对象。

(4)结构中立

Java解释器生成与体系结构无关的字节码指令,只要安装了Java运行时系统,Java程序就可在任意的处理器上运

行。这些字节码指令对应于Java虚拟机中的表示,Java解释器得到字节码后,对它进行转换,使之能够在不同的平台运

行。

(5)开源

Java是一种开源的语言，我们可以看到别人的Java代码。

(6)跨平台

与平台无关的特性使Java程序可以方便地被移植到网络上的不同机器。同时,Java的类库中也实现了与不同平台的

接口,使这些类库可以移植。另外,Java编译器是由Java语言实现的,Java运行时系统由标准C实现,这使得Java系统本身

也具有可移植性。

(7)解释性

Java解释器直接对Java字节码进行解释执行。字节码本身携带了许多编译时信息,使得连接过程更加简单。

(8)高性能

和其它解释执行的语言如BASIC、TCL不同,Java字节码的设计使之能很容易地直接转换成对应于特定CPU的机器

码,从而得到较高的性能。

(9)多线程

多线程机制使应用程序能够并行执行,而且同步机制保证了对共享数据的正确操作。通过使用多线程,程序设计者可

以分别用不同的线程完成特定的行为,而不需要采用全局的事件循环机制,这样就很容易地实现网络上的实时交互行

为。

(10)动态性

ava的设计使它适合于一个不断发展的环境。在类库中可以自由地加入新的方法和实例变量而不会影响用户程序的

执行。并且Java通过接口来支持多重继承,使之比严格的类继承具有更灵活的方式和扩展性。

(11)安全性

用于网络、分布环境下的Java必须要防止病毒的入侵。Java不支持指针,一切对内存的访问都必通过对象的实例变

量来实现,这样就防止程序员使用"特洛伊"木马等欺骗手段访问对象的私有成员,同时也避免了指针操作中容易产生的错

误。

四Java语言的跨平台性

通过Java语言编写的应用程序在不同的系统平台上都可以运行。只要在需要运行java应用程序的操作系统上，先

安装一个Java虚拟机(JVM Java Virtual Machine)即可。由JVM来负责Java程序在该系统中的运行。我们里看一个图

解：

因为有了JVM，所以同一个Java程序在三个不同的操作系统中都可以执行。这样就实现了Java程序的跨平台性。

也称为Java具有良好的可移植性。注意一点：Java语言是跨平台的，而JVM不是跨平台的。

五JDK、JRE、JVM的作用和关系

JRE(Java Runtime Environment   Java运行环境)：包括Java虚拟机(JVM Java Virtual Machine)和Java程序所需的

核心类库等，如果想要运行一个开发好的Java程序，计算机中只需要安装JRE即可。也就是JRE:JVM+类库。

JDK(Java Development Kit     Java开发工具包)：JDK是提供给Java开发人员使用的，其中包含了java的开发工

具，也包括了JRE。所以安装了JDK，就不用在单独安装JRE了。其中的开发工具：编译工具(javac.exe)打包工具

(jar.exe)等。也就是JDK:JRE+JAVA的开发工具。

为什么JDK中包含一个JRE呢？

其一，开发完的程序，总需要运行一下看看效果。

其二，也是最重要的，JDK中的开发工具其实都是java语言编写的应用程序，为了方便使用才打包成exe文件，如

果没有JRE，那么这些工具是运行不了的。

三者的关系简单而言就是：使用JDK开发完成的java程序，交给JRE去运行，由JVM保证跨平台。

六JDK的下载和安装

下载

(1)打开Oracle官网：http://www.oracle.com

(2)点击Downloads和选择Java for Developers

(3)选择Downloads和Java SE

(4)针对不同操作系统，下载不同的JDK版本识别计算机的操作系统

安装

安装的过程中记住自己所安装的路径。我的安装路径为：E:\Java\develop\jdk1.8.0_25

七HelloWorld案例

(1)打开E:\Java\develop\jdk1.8.0_25中的bin目录，我们可以看到很多的应用程序文件，其中有两个我们需要使

用，就是javac.exe和java.exe。

(2)首先编写java源代码程序，扩展名.java。我们在这个文件夹新建一个记事本文件，编写以下的代码，最后将记

事本文件保存为HelloWorld.java格式的文件。因为现在只有当前目录下有javac和java，所以现在将Java源文件保存在

当前目录下。

public class HelloWorld{
public static void main(String[ ] args)
System.out.println("Hello World");
}
}

(3)打开DOS，使用cd命令进入到指定的文件夹：E:\Java\develop\jdk1.8.0_25\bin

(4)在命令行模式中，输入javac命令对源代码进行编译，生成字节码文件

格式为：javac HelloWorld.java

(5)编译完成后，如果没有报错信息，输入java命令对class字节码文件进行解释运行,执行时不需要添加.class扩展

名。

格式为：java HelloWorld

最后我们用图来解释Java程序的运行和工作原理：

在上一篇的博文中，所编辑的Java源文件和编译的字节码文件是保存在E:\Java\develop\jdk1.8.0_25\bin目录下，

如果编辑的Java源文件和字节码文件没有用了或者想要删掉，我们很容易删除bin目录下的其它运行程序文件。还有

如果想要创建很多个Java源文件或者我们开发Java程序，那么bin目录中会存在很多的Java源文件和字节码文件，因

此我们不会将源文件写在bin目录中，需要我们在另外的文件夹下编辑源文件。

我们将编辑好的Java源文件保存在E:\Java\JavaSE\Code目录下，我们来使用DOS编译和运行，那么会出现下面

的错误：

那么我们在当前的文件夹下面怎么做到像在E:\Java\develop\jdk1.8.0_25\bin目录下那样，使用javac编译Java源

文件和使用java运行字节码文件呢？

我们都知道在DOS中可以使用notepad命令打开记事本，我们来看看，在任何盘符或任意的目录中，它是否可以

打开记事本：

经过上面的测试我们可以在计算机中任何的目录下打开记事本，我们想要的编译的Java源文件也需要这样，在任

何的目录下或指定的目录下都可以编译Java源文件和运行Java程序。我们可以模仿打开记事本的方式使用javac命

令。这就需要进行环境变量的配置。

首先我们来看path环境变量。

(1)为什么要配置path环境变量呢？我们来看看path环境变量的作用。

程序的执行需要使用外部指令javac，但是javac指令仅仅能在JDK安装目录下的bin目录下时候，因此程序只能写

入bin目录。程序开发过程中，不能将源代码写入JDK的安装目录，因此需要将源程序保存到任意位置的指定目录(建

议使用英文目录)，所以需要使javac指令在任意目录下可以运行。也就是说.exe结尾的程序就可以在任意的盘符中打

开。下面就来看看配置的方式。

(2)path环境变量配置方式1

通过配置path环境变量，将javac指令所在目录也就是JDK安装目录下的bin目录配置到path变量下，即可使javac

指令在任意目录下运行。将JDK安装目录下的bin目录添加到最左边并添加分号。

配置步骤：

a)找到JDK安装目录下的bin目录，我的是：E:\Java\develop\jdk1.8.0_25\bin

b)右键点击桌面计算机——选择属性——选择高级系统设置

c)在打开的系统属性对话框中选择高级，再找到环境变量

d)在环境变量的对话框中找到系统变量中的Path环境变量，点击编辑。

e)将E:\Java\develop\jdk1.8.0_25\bin;粘贴到Path环境变量的最前边(建议在最前边)，点击确定。

f)重新启动DOS，再次使用javac编译Java源文件和java运行字节码文件。

额外的说一个话题：使用DOS打开QQ

我们配置的Path环境变量作用在前面说过，它可以启动.exe的运行程序，那么我们就来配置一下：

首先还是找到QQ.exe运行程序所在的目录：D:\Program Files\Tencent\QQ\Bin;

重新找到path环境变量，在末尾粘贴上。

重新启动DOS，我们使用QQ外部命令打开QQ运行程序

后面的博文中我会继续进行搭建Java开发环境，还会对path环境的配置进行优化以及配置classpath环境变量。

在上一篇的博文JavaSE入门学习3：搭建Java开发环境(一)中说到我们配置了Path变量的一种方式，再来说说第

二种配置方式，这种配置方式是必须掌握的。

path环境变量配置方式2

我们为什么要将第二种配置形式呢？那第一种的配置方式有什么缺点吗？假设我的计算机上安装了两个JDK，一

个是1.7，一个1.8，我刚才配置的是1.8的，那么我需要配置1.7，需要重新配置Path环境变量，有可能在修改Path环

境变量的同时误删其它的东西，所以不建议使用第一种。

path环境变量的参照形配置方式的步骤：

a)重新打开系统环境变量Path，将第一种配置的路径删除。

b)创建新的环境变量名称：JAVA_HOME；为JAVA_HOME添加变量值：JDK安装目录，我的也就

是：E:\Java\develop\jdk1.8.0_25

c)将path环境变量中JDK目录修改为：%JAVA_HOME%\bin;(%路径名称%相当于引用路径名称)

d)重新启动DOS，再次使用javac编译Java源文件和java运行字节码文件。

这种方式我们在使用其它的JDK时，可以只修改JAVA_HOME变量，不修改Path变量，这样不会误删其他的东西

造成一些其它程序无法运行。

我们再来看一个在Java程序运行的过程中出现的问题，下面的运行结果就是很好的示例，这就需要用到了另一个

系统变量classpath的配置。

classpath环境变量的配置

我们为什么要配置classpath环境变量？classpath环境变量的作用是什么？

我们在将来的Java程序开发中，只需要字节码文件，假设我们在其它的目录下运行字节码文件，结果是和上面的

一样的，是无法运行。因此上面配置的path环境变量只能在一起使用，如果要实现字节码文件在任意的目录下运行，

就需要配置classpath环境变量。因此它的作用是：使classpath目录中的.class文件可以在任意目录运行。

classpath环境变量配置方式

a)创建新的变量名称：classpath

b)变量值：设定为指定的含有class文件的目录，多个目录间使用分号(;)分割。我指定的目录是：E:\Java\JavaSE\Code;

c)重新启动DOS，使用java运行字节码文件。

d)我们在桌面重新编辑一个Java源文件，要求输出：你好，世界，保存的名称还是HelloWorld.java，继续编译和

运行。

e)上面遇到的问题是我们配置的classpath环境变量只是包含了E:\Java\JavaSE\Code这个目录下的字节码文件,

因此解决的方法是：通常将配置的目录最前面添加.;配置，即便当前目录，使.class文件搜索时首先搜索当前目录，然

后根据目录配置的顺序依次查找，找到后即运行，因此classpath目录中的配置存在先后顺序。

f)重新启动DOS，再次运行桌面上的字节码文件。

我们在网上找到的配置classpath的值可能各不相同，不过其中包含最多的就是下面的三个Java类库文件：rt.jar是

JAVA基础类库，dt.jar是关于运行环境的类库，tools.jar是工具类库。我们来看看这些类库。

1)rt.jar默认就根classloader的加载路径里面放在claspath是多此一举不信你可以去classpath里面的rt.jar然后用

java -verbose XXXX 的方式运行一个简单的类 就知道JVM的系统根Loader的路径里面不光rt.jar， jre\lib下面的大部分

jar都在这个路径里。

2)tools.jar是系统用来编译一个类的时候用到的 也就是javac的时候用到javac XXX.java。实际上就是运行java -

calsspath=%JAVA_HOME%\lib\tools.jar xx.xxx.Main XXX.javajavac就是对上面命令的封装 所以tools.jar 也不用加到

classpath里面。

3)dt.jar是关于运行环境的类库,主要是swing的包你要用到swing时最好加上。

因此，最后配置的classpath环境变量的值是：.;E:\Java\JavaSE\Code;%JAVA_HOME%\lib\dt.jar;

path和classpath的区别

path环境变量里面记录的是可执行性文件，如.exe文件，对可执行文件先在当前路径去找，如果没找到就去path

环境变量中配置的路径去找

classpath环境变量里记录的是java类的运行文件所在的目录。

java -version 检测JDK版本：

关于搭建Java开发环境的配置就到这里。

一关键字

关键字概述：Java语言中有一些具有特殊用途的词被称为关键字。关键字对Java的编译器有着特殊的意义，在程

序中应用时一定要慎重。

关键字特点：组成关键字的字母全部小写。

关键字注意事项：goto和const作为保留字存在，当前并不使用。

Java中常用的50个关键字(48个加2个保留字，就当背英文单词啦)：

关键字     描述

abstract    抽象方法，抽象类的修饰符

assert    断言条件是否满足

boolean    布尔数据类型

break    跳出循环或者label代码段

byte    8-bit 有符号数据类型

case    switch语句的一个条件

catch    和try搭配扑捉异常信息

char    16-bit Unicode字符数据类型

class    定义类

const    未使用

continue    不执行循环体剩余部分

default    switch语句中的默认分支

do    循环语句，循环体至少会执行一次

double    64-bit双精度浮点数

else    if条件不成立时执行的分支

enum    枚举类型

extends    表示一个类是另一个类的子类

final    表示一个值在初始化之后就不能再改变了；表示方法不能被重写，或者一个类不能有子类。

finally    为了完成执行的代码而设计的，主要是为了程序的健壮性和完整性，无论有没有异常发生都执行代码。

float    32-bit单精度浮点数

for    for循环语句

goto    未使用

if    条件语句

implements    表示一个类实现了接口

import    导入类

instanceof    测试一个对象是否是某个类的实例

int    32位整型数

interface    接口，一种抽象的类型，仅有方法和常量的定义

long    64位整型数

native    表示方法用非java代码实现

new    分配新的类实例

package    一系列相关类组成一个包

private    表示私有字段，或者方法等，只能从类内部访问

protected    表示字段只能通过类或者其子类访问子类或者在同一个包内的其他类

public    表示共有属性或者方法

return    方法返回值

short    16位数字

static    表示在类级别定义，所有实例共享的

strictfp    浮点数比较使用严格的规则

super    表示基类

switch    选择语句

synchronized    表示同一时间只能由一个线程访问的代码块

this    表示调用当前实例或者调用另一个构造函数

throw    抛出异常

throws    定义方法可能抛出的异常

transient    修饰不要序列化的字段

try    表示代码块要做异常处理或者和finally配合表示是否抛出异常都执行finally中的代码

void    标记方法不返回任何值

volatile    标记字段可能会被多个线程同时访问，而不做同步

while     while循环

二标识符

标识符概述：Java对各种变量，类，接口，方法等起名字时使用的字符序列。

组成规则：1英文大小写字母2数字字符3美元符($)和下划线(_)。

使用标识符时，需要遵守几条规则：

1标识符可以由字母、数字、下划线(_)、美元符($)组成，但不能包含 @、%、空格等其它特殊字符，不能以数字

开头。比如：123name 就是不合法的。

2标识符不能是 Java 关键字和保留字(Java预留的关键字，以后的升级版本中有可能作为关键字)，但可以包含关

键字和保留字。如：不可以使用 void 作为标识符，但是 Myvoid 可以。

3标识符是严格区分大小写的。 所以，一定要分清楚和是两个不同的标识符。

4标识符的命名最好能反映出其作用，做到见名知意。

不合法的标识符：

合法的标识符：

标识符命名的常见类型：

1包(其实就是文件夹，用于解决相同类名进行区分的问题),全部小写。

单级:

举例：student

多级:

举例：student.number

2类或接口：

一个单词：单词的首字母必须大写。

举例：Student

多个单词：每个单词的首字母必须大写。

举例：HelloWorld

3方法和变量：

一个单词：单词的首字母必须小写。

举例：main

多个单词：从第二个单词开始，每个单词的首字母必须大写。

举例：showAllName

4常量：

一个单词:单词字母必须全部大写。

举例：PI

多个单词:每个单字母必须大写，用_隔开 。

举例：STUDENT_MAX_AGE

三注释

注释概述：在编写程序时，经常需要添加一些注释，用以描述某段代码的作用。一般来说，对于一份规范的程序

源代码而言，注释应该占到源代码的 1/3 以上。因此，注释是程序源代码的重要组成部分，一定要加以重视。

Java中注释分类及格式：

Java中注释有三种类型：单行注释、多行注释、文档注释。

1单行注释格式：//注释文字

2多行注释格式：/注释文字/，需要注意的是多行注释不能嵌套使用，而单行是可以的。

3文档注释:/*注释文字/，这个注释的作用的是被javadoc工具解析生成一个说明书。

注释的作用：

1解释说明程序，提高程序的可阅读性；

2可以帮助我们调试程序。

看一个例子：

四常量和变量

常量概述：在程序执行的过程中其值不可以发生改变。所谓常量，我们可以理解为是一种特殊的变量，它的值被

设定后，在程序运行过程中不允许改变。

Java中常量分类：

1字面值常量

A字符串常量：用双引号括起来的内容。

举例："hello" "world"

B整数常量：所有的整数。

举例：100 300

C小数常量：所有的小数。

举例：10.23

D字符常量：用单引号括起来的常量。

举例：'A'  'C'  'O'

E布尔常量：比较特殊，只有true和false

F空常量：null

2自定义常量

语法格式：final 常量名 = 值;

程序中使用常量可以提高代码的可维护性。例如，在项目开发时，我们需要指定用户的性别，此时可以定义一个

常量 SEX，赋值为 "男"，在需要指定用户性别的地方直接调用此常量即可，避免了由于用户的不规范赋值导致程序出

错的情况。

举例：

变量

变量概述：在程序的执行过程中，其值是可以在一定范围内发生改变的量。

在Java中，我们通过三个元素描述变量：变量类型、变量名以及变量值，其中变量名是标识符。

变量的定义格式：

A:数据类型 变量名 = 初始化值;

B:数据类型 变量名;

变量名 = 初始化值;

Java语言是一种强类型语言。通俗点说就是，在Java中存储的数据都是有类型的，而且必须在编译时就确定其类

型。 String 是一种常见的引用数据类型，用来表示字符串。在程序开发中，很多操作都要使用字符串来完成，例如系

统中的用户名、密码、电子邮箱等。这个String引用类型是特殊的。

Java中有两类数据类型：两类十一种

在Java的领域里，基本数据类型变量存的是数据本身，而引用类型变量存的是保存数据的空间地址。这个我们以

后的学习中逐渐体会到。

基本数据类型

A:整数                      占用字节数

byte                  1

short                 2

int                     4

long                  8

B:浮点数

float                   4

double                8

C:字符

char                   2

D:布尔

boolean                    1(并不确定)

使用变量需要的注意事项：

1作用域：变量定义在哪一级大括号中，哪个大括号的范围就是这个变量的作用域。相同的作用域中不能定义两

个同名变量。

2初始化值：没有初始化的值不能直接使用。

3在一行上建议只定义一个变量，可以定义多个，但不建议。

4Java 中的变量需要先声明后使用。

5变量中每次只能赋一个值，但可以修改多次。

6main 方法中定义的变量必须先赋值，然后才能输出。

在Java程序中，不同的基本数据类型的数据之间经常需要进行相互转换。

我们定义的变量的基本数据类型时需要注意：

1整数默认是int类型，浮点数默认是double。

2长整数要加L或者l(建议使用L)。

3单精度的浮点数要加F或者f(建议使用F)。

(1)boolean类型不参与转换，因为不可以以0或非0的整数代替false和true。这一点和其他的高级程序设计语言不

同，一定要注意。

(2)默认转换

A:从小到大

B:byte,short,char -- int -- long -- float -- double

C:byte,short,char之间不相互转换，直接转成int类型参与运算。

(3)强制转换

A:从大到小

B:可能会有精度的损失，一般不建议这样使用。

C:格式：

目标数据类型 变量名 = (目标数据类型) (被转换的数据);

思考题和面试题

A:下面两种方式有区别吗?

float f1 = 12.345f;

float f2 = (float)12.345;

B:下面的程序有问题吗，如果有，在哪里呢?

byte b1 = 3;

byte b2 = 4;

byte b3 = b1 + b2;

byte b4 = 3 + 4;

C:下面的操作结果是什么呢?

byte a = 130;

byte b = (byte)130;

D:字符参与运算

是查找ASCII里面的值，查ASCII表即可

'a'97

'A'65

'0'48

System.out.println('a');

System.out.println('a' + 1);

E:字符串参与运算

这里其实是字符串的连接

System.out.println("hello"+'a'+1);

System.out.println('a'+1+"hello");

System.out.println("5+5="+5+5);

System.out.println(5+5+"=5+5");

上面两个题的输出输出是：

先到这里，若有错误的地方，请指正。

继续接着上篇：JavaSE入门学习5：Java基础语法(一)来看Java的基础语法。

五运算符

运算符是一种“功能”符号，用以通知Java进行相关的运算。比如，我们需要将变量age的值设置为20，这时候就

需要一个"="，告诉程序需要进行赋值操作。

Java 语言中常用的运算符可分为如下几种：算术运算符，赋值运算符，比较运算符，逻辑运算符，条件运符。

(1)算术运算符

算术运算符主要用于进行基本的算术运算，如加法、减法、乘法、除法等。

Java 中常用的算术运算符：

其中，++和--既可以出现在操作数的左边，也可以出现在右边，但结果是不同的。

%用来求余数，也称为”取模运算符“。

(2)赋值运算符

赋值运算符是指为变量或常量指定数值的符号。如可以使用"="将右边的表达式结果赋给左边的操作数。

Java支持的常用赋值运算符，如下表所示：

(3)比较运算符

比较运算符用于判断两个数据的大小，例如：大于、等于、不等于。比较的结果是一个布尔值(true或false)。

Java 中常用的比较运算符如下表所示：

1)> 、 < 、 >= 、 <= 只支持左右两边操作数是数值类型。

2)== 、!= 两边的操作数既可以是数值类型，也可以是引用类型。

(4)逻辑运算符

逻辑运算符主要用于进行逻辑运算。Java中常用的逻辑运算符如下表所示：

我们可以从"投票选举"的角度理解逻辑运算符：

1)与：要求所有人都投票同意，才能通过某议题。

2)或：只要求一个人投票同意就可以通过某议题。

3)非：某人原本投票同意，通过非运算符，可以使其投票无效。

4)异或：有且只能有一个人投票同意，才可以通过某议题。

当使用逻辑运算符时，我们会遇到一种很有趣的“短路”现象。

比如：(one>two)&&(one<three)中，如果能确定左边one>two运行结果为false , 则系统就认为已经没有必要执行

右侧的one<three。

同理，在(one>two)||(one<three)中，如果能确定左边表达式的运行结果为true , 则系统也同样会认为已经没有必

要再进行右侧的one<three的执行。

(5)条件运算符

条件运算符(? : )也称为 “三元运算符”。

语法形式：布尔表达式?表达式1:表达式2;

运算过程：如果布尔表达式的值为true，则返回表达1的值，否则返回表达式2的值。

(6)运算符优先级

所谓优先级，就是在表达式中的运算顺序。Java 中常用的运算符的优先级如下表所示：

六语句

(1)Java条件语句之if

生活中，我们经常需要先做判断，然后才决定是否要做某件事。例如，如果考试成绩大于 90 分，则奖励一个

IPHONE 5S 对于这种“需要先判断条件，条件满足后才执行的情况”，就可以使用if条件语句实现。

语法：

执行过程：

如：

如果 if 条件成立时的执行语句只有一条，是可以省略大括号的；但如果执行语句有多条，那么大括号就是不可或

缺的。

(2)Java条件语句之if...else

if...else 语句的操作比if语句多了一步:当条件成立时，则执行if部分的代码块；条件不成立时，则进入else部分。

例如，如果考试成绩大于90分，则奖励一个IPHONE 5S ，否则罚做500个俯卧撑。

语法：

执行过程：

如：

(3)Java条件语句之多重if

多重if语句，在条件1不满足的情况下，才会进行条件2的判断；当前面的条件均不成立时，才会执行else块内的代

码。例如，如果考试成绩大于90分，则奖励一个IPHONE 5S，如果成绩介于70分至90分之间，则奖励一个红米，否

则罚做500个俯卧撑。

语法：

执行过程：

如：

(4)Java条件语句之嵌套if

嵌套if语句，只有当外层if的条件成立时，才会判断内层if的条件。例如，活动计划的安排，如果今天是工作日，

则去上班，如果今天是周末，则外出游玩；同时，如果周末天气晴朗，则去室外游乐场游玩，否则去室内游乐场游

玩。

语法：

执行过程：

如：

(4)Java条件语句之switch

当需要对选项进行等值判断时，使用switch语句更加简洁明了。例如：根据考试的名次，给予前4名不同的奖品。

第一名，奖励笔记本一台；第二名，奖励IPAD2 一个；第三名，奖励移动电源一个；最后一名奖励U盘一个。

语法：

执行过程：当switch后表达式的值和case语句后的值相同时，从该位置开始向下执行，直到遇到break语句或者

switch语句块结束；如果没有匹配的case语句则执行default块的代码。

如：

注意事项：

1)switch后面小括号中表达式的值必须是整型或字符型。

2)case后面的值可以是常量数值，如1、2；也可以是一个常量表达式，如2+2；但不能是变量或带有变量的表达

式，如a*2。

3)case匹配后，执行匹配块里的程序代码，如果没有遇见break会继续执行下一个的case块的内容，直到遇到

break语句或者switc语句块结束。不建议这样使用，如：

运行结果：

4)可以把功能相同的case语句合并起来，如：

5)default 块可以出现在任意位置，也可以省略。

继续接着Java基础语法来：JavaSE入门学习5：Java基础语法(一)和JavaSE入门学习6：Java基础语法(二)。

Java常用的3种循环：while，do...while，for。

(5)Java循环语句之while

语法：

执行过程：

1)判断while后面的条件是否成立(true/false)。

2)当条件成立时，执行循环内的操作代码 ，然后重复执行1),2),直到循环条件不成立为止。

特点：先判断，后执行。

如：

(6)Java循环语句之do...while

do...while循环与while循环语法有些类似，但执行过程差别比较大。

语法：

执行过程：

1)先执行一遍循环操作，然后判断循环条件是否成立。

2)如果条件成立，继续执行1),2)，直到循环条件不成立为止。

特点： 先执行，后判断。

由此可见，do...while语句保证循环至少被执行一次。这就是和while循环语句的区别。

例如，依然输出 1000 遍“我爱慕课网”，使用do...while的实现代码为：

(7)Java循环语句之for

Java 的循环结构中除了while和do...while外，还有for循环，三种循环可以相互替换。

语法：

执行过程：

1)执行循环变量初始化部分，设置循环的初始状态，此部分在整个循环中只执行一次。

2)进行循环条件的判断，如果条件为true，则执行循环体内代码；如果为false，则直接退出循环。

3)执行循环变量变化部分，改变循环变量的值，以便进行下一次条件判断。

4)依次重新执行2),3),4)，直到退出循环

特点：相比 while 和 do...while 语句结构更加简洁易读。

例如，输出 1000 遍“我爱慕课网”，使用 for 的实现代码为：

需要留心的几个小细节：

1)for关键字后面括号中的三个表达式必须用";" 隔开，三个表达式都可以省略，但";"不能省略。

a. 省略“循环变量初始化”，可以在 for 语句之前由赋值语句进行变量初始化操作，如：

b. 省略“循环条件”，可能会造成循环将一直执行下去，也就是我们常说的“死循环”现象，如：

在编程过程中要避免“死循环”的出现，因此，对于上面的代码可以在循环体中使用break语句强制跳出循环。

c. 省略“循环变量变化”，可以在循环体中进行循环变量的变化，如：

2)for 循环变量初始化和循环变量变化部分，可以是使用 “,” 同时初始化或改变多个循环变量的值，如：

代码中，初始化变量部分同时对两个变量i和j赋初值，循环变量变化部分也同时对两个变量进行变化，运行结果：

3)循环条件部分可以使用逻辑运算符组合的表达式，表示复杂判断条件，但一定注意运算的优先级，如：

代码中，必须同时满足变量i小于10 ，并且i不等于5时才会进行循环，输出变量i的值。

(8)Java循环跳转语句之break语句

生活中，我们经常会因为某些原因中断既定的任务安排。在Java中，我们可以使用 break语句退出指定的循环，

直接执行循环后面的代码。

例如，使用循环输出1--10的数值，其中，如果数值大于2 ，并且为3的倍数则停止输出。

实现代码：

运行结果：

(9)Java循环跳转语句之continue语句

continue语句的作用是跳过循环体中剩余的语句执行下一次循环。

例如，打印1--10之间所有的偶数，使用continue语句实现代码为：

运行结果：

(10)Java循环语句之多重循环

循环体中包含循环语句的结构称为多重循环。三种循环语句可以自身嵌套，也可以相互嵌套，最常见的就是二重

循环。在二重循环中，外层循环每执行一次，内层循环要执行一圈。

如下所示：

例如：使用*打印长方形：

实现代码为：

执行流程：当i = 1时，外层循环条件成立，进入内层循环，开始打印第一行内容。此时，j从1开始，循环8次，内

层循环结束后换行，实现第一行 8个 * 的输出。接下来返回外层循环i变为2，准备打印下一行，依此类推，直到完成

长方形的打印。

那我们再来做一个直角三角形的输出，如：

实现代码：

最后再来补充一下基本数据类型之间的转换：

基本数据类型转换

1)boolean类型不参与转换，因为不可以以0或非0的整数代替false和true。这一点和其他的高级程序设计语言不

同，一定要注意。

2)整型，字符型，浮点型的数据类型在混合运算中相互转换，转换时遵循以下的规则：

A默认转换

容量小的类型自动转换为容量大的数据类型，数据类型按容量大小排序为：

byte,short,char -- int -- long -- float -- double

byte,short,char之间不相互转换，在计算时首先直接转成int类型参与运算。

B强制转换

容量大的数据类型转换为容量小的数据类型时，要加上强制转换符，但可能造成精确度降低或溢出，使用时一定要注意。

C有多种类型的数据混合运算时，系统首选自动的将所有的数据转成容量大的那一种数据类型，再进行计算。

实例的话参考JavaSE入门学习5：Java基础语法(一)中最后面的面试题和思考题。

七方法

如何定义Java中的方法所谓方法，就是用来解决一类问题的代码的有序组合，是一个功能模块。一般情况下，定

义一个方法的语法是：

其中：

1访问修饰符：方法允许被访问的权限范围， 可以是 public、protected、private甚至可以省略 ，其中public表示

该方法可以被其他任何代码调用。

2返回值类型：方法返回值的类型，如果方法不返回任何值，则返回值类型指定为void；如果方法具有返回值，则

需要指定返回值的类型，并且在方法体中使用return语句返回值。

3方法名：定义的方法的名字，必须使用合法的标识符。

4参数列表：传递给方法的参数列表，参数可以有多个，多个参数间以逗号隔开，每个参数由参数类型和参数名

组成，以空格隔开。

根据方法是否带参、是否带返回值，可将方法分为四类：

1)无参无返回值方法；

2)无参带返回值方法；

3)带参无返回值方法；

4)带参带返回值方法；

(1)无参无返回值方法的使用

如果方法不包含参数，且没有返回值，我们称为无参无返回值的方法。

方法的使用分两步：

第一步，定义方法

例如：下面代码定义了一个方法名为show，没有参数，且没有返回值的方法，执行的操作为输出"welcome to

imooc."

需要注意的事项有：

1方法体放在一对大括号中，实现特定的操作。

2方法名主要在调用这个方法时使用，需要注意命名的规范，一般采用第一个单词首字母小写，其它单词首字母

大写的形式。

第二步，调用方法

当需要调用方法执行某个操作时，可以先创建类的对象，然后通过对象名.方法名()来实现。

例如：在下面的代码中，我们创建了一个名为 hello 的对象，然后通过调用该对象的show( )方法输出信息。

运行结果为：welcome to imooc.

(2)无参带返回值方法的使用

如果方法不包含参数，但有返回值，我们称为无参带返回值的方法。

例如：下面的代码，定义了一个方法名为calSum，无参数，但返回值为int类型的方法，执行的操作为计算两数之

和，并返回结果。

在calSum( )方法中，返回值类型为int类型，因此在方法体中必须使用return返回一个整数值。

调用带返回值的方法时需要注意，由于方法执行后会返回一个结果，因此在调用带返回值方法时一般都会接收其

返回值并进行处理。如：

运行结果为： 两数之和为：17

需要注意的事项有：

1如果方法的返回类型为void ，则方法中不能使用return返回值。

2方法的返回值最多只能有一个，不能返回多个值。

3方法返回值的类型必须兼容，例如，如果返回值类型为int ，则不能返回String型值。

(3)带参无返回值方法的使用

有时方法的执行需要依赖于某些条件，换句话说，要想通过方法完成特定的功能，需要为其提供额外的信息行。

我们可以通过在方法中加入参数列表接收外部传入的数据信息，参数可以是任意的基本类型数据或引用类型数据。

我们先来看一个带参数，但没有返回值的方法：

上面的代码定义了一个show方法，带有一个参数name，实现输出欢迎消息。

调用带参方法与调用无参方法的语法类似，但在调用时必须传入实际的参数值。

例如：

运行结果为： 欢迎您，爱慕课！

很多时候，我们把定义方法时的参数称为形参，目的是用来定义方法需要传入的参数的个数和类型；把调用方法

时的参数称为实参，是传递给方法真正被处理的值。

需要注意的事项有：

1调用带参方法时，必须保证实参的数量、类型、顺序与形参一一对应。

2调用方法时，实参不需要指定数据类型，如

3方法的参数可以是基本数据类型，如 int、double等，也可以是引用数据类型，如String、数组等。

4当方法参数有多个时，多个参数间以逗号分隔。

(4)带参带返回值方法的使用

如果方法既包含参数，又带有返回值，我们称为带参带返回值的方法。

例如：下面的代码，定义了一个show方法，带有一个参数name，方法执行后返回一个String 类型的结果。

调用带参带返回值的方法：

运行结果为： 欢迎您，爱慕课！

(5)Java中方法的重载

如果同一个类中包含了两个或两个以上方法名相同、方法参数的个数、顺序或类型不同的方法，则称为方法的重

载，也可称该方法被重载了。如下所示4个方法名称都为show ，但方法的参数有所不同，因此都属于方法的重载：

当调用被重载的方法时， Java 会根据参数的个数和类型来判断应该调用哪个重载方法，参数完全匹配的方法将

被执行。如：

运行结果：

判断方法重载的依据：

1必须是在同一个类中；

2方法名相同；

3方法参数的个数、顺序或类型不同；

4与方法的修饰符或返回值没有关系；

在慕课网学习的时候遇到了这样一个Java编程练习题，正好对所学习的Java基础知识检验一下：

请根据所学知识，编写一个Java程序，实现输出考试成绩的前三名

要求：
1考试成绩已保存在数组scores中，数组元素依次为89 , -23 , 64 , 91 , 119 , 52 , 73

2要求通过自定义方法来实现成绩排名并输出操作，将成绩数组作为参数传入

3要求判断成绩的有效性（ 0—100 ），如果成绩无效，则忽略此成绩

我自己分析了一下这个程序的过程：

(1)首先是定义一个包含整型数组参数的方法，用来接收成绩数组，进行成绩排序并输出前三名

具体的步骤是：

A在方法中使用Arrays类的sort( )方法对数组进行排序，默认按升序排列，注意Arrays类的使用需要导入；

//引入数组类
import java.util.Arrays;

B由于只需要输出考试成绩的前三名，所以定义一个变量，统计有效成绩的前三名的数量；

C使用 for 循环遍历数组中的元素，由于要输出的是前三名成绩，所以从后往前遍历，即倒序遍历；

for(int i = scores.length - 1; i >= 0; i-- ) {

}

D在for循环中判断成绩的有效性，如果成绩小于 0 或大于 100 ，则使用continue忽略此成绩；

E如果成绩有效，则有效成绩数加1。判断有效成绩的个数，如果有效成绩数等于3 ，则结束循环，只输出成绩的

前三名；

(2)完成 main 方法

A定义一个成绩数组 scores ，保存预定的考试成绩89 , -23 , 64 , 91 , 119 , 52 , 73；

B调用自定义方法，传入成绩数组，完成成绩的输出；

具体实现的代码为：

//引入数组类
import java.util.Arrays;
public class Test {

//完成 main 方法
public static void main(String[] args) {
//创建HelloWorld类的实例对象
Test test=new Test();
//定义一个整型数组
int[] scores={89,-23,64,91,119,52,73,-45,78,168};
System.out.println("考试成绩的前三名为：");
//调用类的方法，输出结果
test.result(scores);

}

//定义方法完成成绩排序并输出前三名的功能
public void result(int[] scores){
//使用数组的sort()方法进行排序
Arrays.sort(scores);
//初始化变量
int count=0;
for(int i=scores.length-1;i>=0;i--){
//若进入循环不是有效的成绩时，跳过这个成绩
if(scores[i]<0||scores[i]>100){
continue;
}
count++;
System.out.println(scores[i]);
//累计输出的分数个数为3时，中止循环
if(count==3){
break;
}
}
}
}

输出的结果：