Java是由Sun Microsystems公司于1995年5月推出的Java面向对象程序设计语言和Java平台的总称。由James Gosling和同事们共同研发,并在1995年正式推出。html
Java分为三个体系:java
2005年6月,JavaOne大会召开,SUN公司公开Java SE 6。此时,Java的各类版本已经改名以取消其中的数字"2":J2EE改名为Java EE, J2SE改名为Java SE,J2ME改名为Java ME。git
Java语言的语法与C语言和C++语言很接近,使得大多数程序员很容易学习和使用。另外一方面,Java丢弃了C++中不多使用的、很难理解的、使人迷惑的那些特性,如操做符重载、多继承、自动的强制类型转换。特别地,Java语言不使用指针,而是引用。并提供了自动的废料收集,使得程序员没必要为内存管理而担心。程序员
Java语言提供类、接口和继承等面向对象的特性,为了简单起见,只支持类之间的单继承,但支持接口之间的多继承,并支持类与接口之间的实现机制(关键字为implements)。Java语言全面支持动态绑定,而C++语言只对虚函数使用动态绑定。总之,Java语言是一个纯的面向对象程序设计语言。正则表达式
Java语言支持Internet应用的开发,在基本的Java应用编程接口中有一个网络应用编程接口(java net),它提供了用于网络应用编程的类库,包括URL、URLConnection、Socket、ServerSocket等。Java的RMI(远程方法激活)机制也是开发分布式应用的重要手段。算法
Java的强类型机制、异常处理、垃圾的自动收集等是Java程序健壮性的重要保证。对指针的丢弃是Java的明智选择。Java的安全检查机制使得Java更具健壮性。express
Java一般被用在网络环境中,为此,Java提供了一个安全机制以防恶意代码的攻击。除了Java语言具备的许多安全特性之外,Java对经过网络下载的类具备一个安全防范机制(类ClassLoader),如分配不一样的名字空间以防替代本地的同名类、字节代码检查,并提供安全管理机制(类SecurityManager)让Java应用设置安全哨兵。编程
Java程序(后缀为java的文件)在Java平台上被编译为体系结构中立的字节码格式(后缀为class的文件),而后能够在实现这个Java平台的任何系统中运行。这种途径适合于异构的网络环境和软件的分发。数组
这种可移植性来源于体系结构中立性,另外,Java还严格规定了各个基本数据类型的长度。Java系统自己也具备很强的可移植性,Java编译器是用Java实现的,Java的运行环境是用ANSI C实现的。安全
如前所述,Java程序在Java平台上被编译为字节码格式,而后能够在实现这个Java平台的任何系统中运行。在运行时,Java平台中的Java解释器对这些字节码进行解释执行,执行过程当中须要的类在联接阶段被载入到运行环境中。
与那些解释型的高级脚本语言相比,Java的确是高性能的。事实上,Java的运行速度随着JIT(Just-In-Time)编译器技术的发展愈来愈接近于C++。
在Java语言中,线程是一种特殊的对象,它必须由Thread类或其子(孙)类来建立。一般有两种方法来建立线程:其一,使用型构为Thread(Runnable)的构造子类将一个实现了Runnable接口的对象包装成一个线程,其二,从Thread类派生出子类并重写run方法,使用该子类建立的对象即为线程。值得注意的是Thread类已经实现了Runnable接口,所以,任何一个线程均有它的run方法,而run方法中包含了线程所要运行的代码。线程的活动由一组方法来控制。Java语言支持多个线程的同时执行,并提供多线程之间的同步机制(关键字为synchronized)。
Java语言的设计目标之一是适应于动态变化的环境。Java程序须要的类可以动态地被载入到运行环境,也能够经过网络来载入所须要的类。这也有利于软件的升级。另外,Java中的类有一个运行时刻的表示,能进行运行时刻的类型检查。
首先咱们须要下载java开发工具包JDK,下载地址:http://www.oracle.com/technetwork/java/javase/downloads/index.html
配置环境变量
变量设置参数以下:
变量名:Path
变量值:%JAVA_HOME%\bin;%JAVA_HOME%\jre\bin;
一、"开始"->"运行",键入"cmd";
二、键入命令: java -version、java、javac 几个命令,出现如下信息,说明环境变量配置成功;
一个 Java 程序能够认为是一系列对象的集合,而这些对象经过调用彼此的方法来协同工做。下面简要介绍下类、对象、方法和实例变量的概念。
编写 Java 程序时,应注意如下几点:
Java 全部的组成部分都须要名字。类名、变量名以及方法名都被称为标识符。
关于 Java 标识符,有如下几点须要注意:
像其余语言同样,Java可使用修饰符来修饰类中方法和属性。主要有两类修饰符:
在后面的章节中咱们会深刻讨论 Java 修饰符。
Java 中主要有以下几种类型的变量
数组是储存在堆上的对象,能够保存多个同类型变量。在后面的章节中,咱们将会学到如何声明、构造以及初始化一个数组。
Java 5.0引入了枚举,枚举限制变量只能是预先设定好的值。使用枚举能够减小代码中的 bug。
例如,咱们为果汁店设计一个程序,它将限制果汁为小杯、中杯、大杯。这就意味着它不容许顾客点除了这三种尺寸外的果汁。
下面列出了 Java 关键字。这些保留字不能用于常量、变量、和任何标识符的名称。
类别 | 关键字 | 说明 |
---|---|---|
访问控制 | private | 私有的 |
protected | 受保护的 | |
public | 公共的 | |
类、方法和变量修饰符 | abstract | 声明抽象 |
class | 类 | |
extends | 扩充,继承 | |
final | 最终值,不可改变的 | |
implements | 实现(接口) | |
interface | 接口 | |
native | 本地,原生方法(非 Java 实现) | |
new | 新,建立 | |
static | 静态 | |
strictfp | 严格,精准 | |
synchronized | 线程,同步 | |
transient | 短暂 | |
volatile | 易失 | |
程序控制语句 | break | 跳出循环 |
case | 定义一个值以供 switch 选择 | |
continue | 继续 | |
default | 默认 | |
do | 运行 | |
else | 不然 | |
for | 循环 | |
if | 若是 | |
instanceof | 实例 | |
return | 返回 | |
switch | 根据值选择执行 | |
while | 循环 | |
错误处理 | assert | 断言表达式是否为真 |
catch | 捕捉异常 | |
finally | 有没有异常都执行 | |
throw | 抛出一个异常对象 | |
throws | 声明一个异常可能被抛出 | |
try | 捕获异常 | |
包相关 | import | 引入 |
package | 包 | |
基本类型 | boolean | 布尔型 |
byte | 字节型 | |
char | 字符型 | |
double | 双精度浮点 | |
float | 单精度浮点 | |
int | 整型 | |
long | 长整型 | |
short | 短整型 | |
变量引用 | super | 父类,超类 |
this | 本类 | |
void | 无返回值 | |
保留关键字 | goto | 是关键字,但不能使用 |
const | 是关键字,但不能使用 | |
null | 空 |
空白行或者有注释的行,Java 编译器都会忽略掉。
在 Java 中,一个类能够由其余类派生。若是你要建立一个类,并且已经存在一个类具备你所须要的属性或方法,那么你能够将新建立的类继承该类。
利用继承的方法,能够重用已存在类的方法和属性,而不用重写这些代码。被继承的类称为超类(super class),派生类称为子类(subclass)。
在 Java 中,接口可理解为对象间相互通讯的协议。接口在继承中扮演着很重要的角色。
接口只定义派生要用到的方法,可是方法的具体实现彻底取决于派生类。
以下图所示:
Java做为一种面向对象语言。支持如下基本概念:
本节咱们重点研究对象和类的概念。
如今让咱们深刻了解什么是对象。看看周围真实的世界,会发现身边有不少对象,车,狗,人等等。全部这些对象都有本身的状态和行为。
拿一条狗来举例,它的状态有:名字、品种、颜色,行为有:叫、摇尾巴和跑。
对比现实对象和软件对象,它们之间十分类似。
软件对象也有状态和行为。软件对象的状态就是属性,行为经过方法体现。
在软件开发中,方法操做对象内部状态的改变,对象的相互调用也是经过方法来完成。
一个类能够包含如下类型变量:
每一个类都有构造方法。若是没有显式地为类定义构造方法,Java编译器将会为该类提供一个默认构造方法。
在建立一个对象的时候,至少要调用一个构造方法。构造方法的名称必须与类同名,一个类能够有多个构造方法。
对象是根据类建立的。在Java中,使用关键字new来建立一个新的对象。建立对象须要如下三步:
经过已建立的对象来访问成员变量和成员方法,
类有若干种访问级别,而且类也分不一样的类型:抽象类和final类等。这些将在访问控制章节介绍。
除了上面提到的几种类型,Java还有一些特殊的类,如:内部类、匿名类。
包主要用来对类和接口进行分类。当开发Java程序时,可能编写成百上千的类,所以颇有必要对类和接口进行分类。
在Java中,若是给出一个完整的限定名,包括包名、类名,那么Java编译器就能够很容易地定位到源代码或者类。Import语句就是用来提供一个合理的路径,使得编译器能够找到某个类。
变量就是申请内存来存储值。也就是说,当建立变量的时候,须要在内存中申请空间。
内存管理系统根据变量的类型为变量分配存储空间,分配的空间只能用来储存该类型数据。
所以,经过定义不一样类型的变量,能够在内存中储存整数、小数或者字符。
Java 的两大数据类型:
Java语言提供了八种基本类型。六种数字类型(四个整数型,两个浮点型),一种字符类型,还有一种布尔型。
byte:
short:
int:
long:
float:
double:
boolean:
char:
数据类型 | 默认值 |
---|---|
byte | 0 |
short | 0 |
int | 0 |
long | 0L |
float | 0.0f |
double | 0.0d |
char | 'u0000' |
String (or any object) | null |
boolean | false |
常量在程序运行时是不能被修改的。
在 Java 中使用 final 关键字来修饰常量,声明方式和变量相似:
final double PI = 3.1415927;
虽然常量名也能够用小写,但为了便于识别,一般使用大写字母表示常量。
字面量能够赋给任何内置类型的变量。例如:
byte a = 68; char a = 'A'
byte、int、long、和short均可以用十进制、16进制以及8进制的方式来表示。
当使用常量的时候,前缀 0 表示 8 进制,而前缀 0x 表明 16 进制, 例如:
int decimal = 100; int octal = 0144; int hexa = 0x64;
和其余语言同样,Java的字符串常量也是包含在两个引号之间的字符序列。下面是字符串型字面量的例子:
"Hello World" "two\nlines" "\"This is in quotes\""
字符串常量和字符常量均可以包含任何Unicode字符。例如:
char a = '\u0001'; String a = "\u0001";
Java语言支持一些特殊的转义字符序列。
符号 | 字符含义 |
---|---|
\n | 换行 (0x0a) |
\r | 回车 (0x0d) |
\f | 换页符(0x0c) |
\b | 退格 (0x08) |
\0 | 空字符 (0x20) |
\s | 字符串 |
\t | 制表符 |
\" | 双引号 |
\' | 单引号 |
\\ | 反斜杠 |
\ddd | 八进制字符 (ddd) |
\uxxxx | 16进制Unicode字符 (xxxx) |
整型、实型(常量)、字符型数据能够混合运算。运算中,不一样类型的数据先转化为同一类型,而后进行运算。
转换从低级到高级。
低 ------------------------------------> 高 byte,short,char—> int —> long—> float —> double
数据类型转换必须知足以下规则:
1. 不能对boolean类型进行类型转换。
2. 不能把对象类型转换成不相关类的对象。
3. 在把容量大的类型转换为容量小的类型时必须使用强制类型转换。
4. 转换过程当中可能致使溢出或损失精度,例如:
int i =128; byte b = (byte)i;
由于 byte 类型是 8 位,最大值为127,因此当 int 强制转换为 byte 类型时,值 128 时候就会致使溢出。
5. 浮点数到整数的转换是经过舍弃小数获得,而不是四舍五入,例如:
(int)23.7 == 23; (int)-45.89f == -45
必须知足转换前的数据类型的位数要低于转换后的数据类型,例如: short数据类型的位数为16位,就能够自动转换位数为32的int类型,一样float数据类型的位数为32,能够自动转换为64位的double类型。
1. 条件是转换的数据类型必须是兼容的。
2. 格式:(type)value type是要强制类型转换后的数据类型
1. 整数的默认类型是 int。
2. 浮点型不存在这种状况,由于在定义 float 类型时必须在数字后面跟上 F 或者 f。
Java语言支持的变量类型有:
Java语言提供了不少修饰符,主要分为如下两类:
Java中,可使用访问控制符来保护对类、变量、方法和构造方法的访问。Java 支持 4 种不一样的访问权限。
default (即默认,什么也不写): 在同一包内可见,不使用任何修饰符。使用对象:类、接口、变量、方法。
private : 在同一类内可见。使用对象:变量、方法。 注意:不能修饰类(外部类)
public : 对全部类可见。使用对象:类、接口、变量、方法
protected : 对同一包内的类和全部子类可见。使用对象:变量、方法。 注意:不能修饰类(外部类)。
咱们能够经过如下表来讲明访问权限:
修饰符 | 当前类 | 同一包内 | 子孙类(同一包) | 子孙类(不一样包) | 其余包 |
---|---|---|---|---|---|
public |
Y | Y | Y | Y | Y |
protected |
Y | Y | Y | Y/N(说明) | N |
default |
Y | Y | Y | N | N |
private |
Y | N | N | N | N |
使用默认访问修饰符声明的变量和方法,对同一个包内的类是可见的。接口里的变量都隐式声明为 public static final,而接口里的方法默认状况下访问权限为 public。
私有访问修饰符是最严格的访问级别,因此被声明为 private 的方法、变量和构造方法只能被所属类访问,而且类和接口不能声明为 private。
声明为私有访问类型的变量只能经过类中公共的 getter 方法被外部类访问。
Private 访问修饰符的使用主要用来隐藏类的实现细节和保护类的数据。
被声明为 public 的类、方法、构造方法和接口可以被任何其余类访问。
若是几个相互访问的 public 类分布在不一样的包中,则须要导入相应 public 类所在的包。因为类的继承性,类全部的公有方法和变量都能被其子类继承。
protected 须要从如下两个点来分析说明:
子类与基类在同一包中:被声明为 protected 的变量、方法和构造器能被同一个包中的任何其余类访问;
子类与基类不在同一包中:那么在子类中,子类实例能够访问其从基类继承而来的 protected 方法,而不能访问基类实例的protected方法。
protected 能够修饰数据成员,构造方法,方法成员,不能修饰类(内部类除外)。
请注意如下方法继承的规则:
父类中声明为 public 的方法在子类中也必须为 public。
父类中声明为 protected 的方法在子类中要么声明为 protected,要么声明为 public,不能声明为 private。
父类中声明为 private 的方法,不可以被继承。
为了实现一些其余的功能,Java 也提供了许多非访问修饰符。
static 修饰符,用来修饰类方法和类变量。
final 修饰符,用来修饰类、方法和变量,final 修饰的类不可以被继承,修饰的方法不能被继承类从新定义,修饰的变量为常量,是不可修改的。
abstract 修饰符,用来建立抽象类和抽象方法。
synchronized 和 volatile 修饰符,主要用于线程的编程。
静态变量:
static 关键字用来声明独立于对象的静态变量,不管一个类实例化多少对象,它的静态变量只有一份拷贝。 静态变量也被称为类变量。局部变量不能被声明为 static 变量。
静态方法:
static 关键字用来声明独立于对象的静态方法。静态方法不能使用类的非静态变量。静态方法从参数列表获得数据,而后计算这些数据。
对类变量和方法的访问能够直接使用 classname.variablename 和 classname.methodname 的方式访问。
final 变量:
final 表示"最后的、最终的"含义,变量一旦赋值后,不能被从新赋值。被 final 修饰的实例变量必须显式指定初始值。
final 修饰符一般和 static 修饰符一块儿使用来建立类常量。
final 方法
父类中的 final 方法能够被子类继承,可是不能被之类重写。
声明 final 方法的主要目的是防止该方法的内容被修改。
final 类
final 类不能被继承,没有类可以继承 final 类的任何特性。
抽象类:
抽象类不能用来实例化对象,声明抽象类的惟一目的是为了未来对该类进行扩充。
一个类不能同时被 abstract 和 final 修饰。若是一个类包含抽象方法,那么该类必定要声明为抽象类,不然将出现编译错误。
抽象类能够包含抽象方法和非抽象方法。
抽象方法
抽象方法是一种没有任何实现的方法,该方法的的具体实现由子类提供。
抽象方法不能被声明成 final 和 static。
任何继承抽象类的子类必须实现父类的全部抽象方法,除非该子类也是抽象类。
若是一个类包含若干个抽象方法,那么该类必须声明为抽象类。抽象类能够不包含抽象方法。
synchronized 关键字声明的方法同一时间只能被一个线程访问。synchronized 修饰符能够应用于四个访问修饰符。
序列化的对象包含被 transient 修饰的实例变量时,java 虚拟机(JVM)跳过该特定的变量。
该修饰符包含在定义变量的语句中,用来预处理类和变量的数据类型。
volatile 修饰的成员变量在每次被线程访问时,都强制从共享内存中从新读取该成员变量的值。并且,当成员变量发生变化时,会强制线程将变化值回写到共享内存。这样在任什么时候刻,两个不一样的线程老是看到某个成员变量的同一个值。
一个 volatile 对象引用多是 null。
计算机的最基本用途之一就是执行数学运算,做为一门计算机语言,Java也提供了一套丰富的运算符来操纵变量。咱们能够把运算符分红如下几组:
算术运算符用在数学表达式中,它们的做用和在数学中的做用同样。下表列出了全部的算术运算符。
表格中的实例假设整数变量A的值为10,变量B的值为20:
操做符 | 描述 | 例子 |
---|---|---|
+ | 加法 - 相加运算符两侧的值 | A + B 等于 30 |
- | 减法 - 左操做数减去右操做数 | A – B 等于 -10 |
* | 乘法 - 相乘操做符两侧的值 | A * B等于200 |
/ | 除法 - 左操做数除以右操做数 | B / A等于2 |
% | 取余 - 左操做数除以右操做数的余数 | B%A等于0 |
++ | 自增: 操做数的值增长1 | B++ 或 ++B 等于 21(区别详见下文) |
-- | 自减: 操做数的值减小1 | B-- 或 --B 等于 19(区别详见下文) |
一、自增(++)自减(--)运算符是一种特殊的算术运算符,在算术运算符中须要两个操做数来进行运算,而自增自减运算符是一个操做数。
二、前缀自增自减法(++a,--a): 先进行自增或者自减运算,再进行表达式运算。
三、后缀自增自减法(a++,a--): 先进行表达式运算,再进行自增或者自减运算
下表为Java支持的关系运算符
表格中的实例整数变量A的值为10,变量B的值为20:
运算符 | 描述 | 例子 |
---|---|---|
== | 检查若是两个操做数的值是否相等,若是相等则条件为真。 | (A == B)为假。 |
!= | 检查若是两个操做数的值是否相等,若是值不相等则条件为真。 | (A != B) 为真。 |
> | 检查左操做数的值是否大于右操做数的值,若是是那么条件为真。 | (A> B)为假。 |
< | 检查左操做数的值是否小于右操做数的值,若是是那么条件为真。 | (A <B)为真。 |
>= | 检查左操做数的值是否大于或等于右操做数的值,若是是那么条件为真。 | (A> = B)为假。 |
<= | 检查左操做数的值是否小于或等于右操做数的值,若是是那么条件为真。 | (A <= B)为真。 |
Java定义了位运算符,应用于整数类型(int),长整型(long),短整型(short),字符型(char),和字节型(byte)等类型。
位运算符做用在全部的位上,而且按位运算。
下表列出了位运算符的基本运算,假设整数变量A的值为60和变量B的值为13:
操做符 | 描述 | 例子 |
---|---|---|
& | 若是相对应位都是1,则结果为1,不然为0 | (A&B),获得12,即0000 1100 |
| | 若是相对应位都是0,则结果为0,不然为1 | (A | B)获得61,即 0011 1101 |
^ | 若是相对应位值相同,则结果为0,不然为1 | (A ^ B)获得49,即 0011 0001 |
〜 | 按位取反运算符翻转操做数的每一位,即0变成1,1变成0。 | (〜A)获得-61,即1100 0011 |
<< | 按位左移运算符。左操做数按位左移右操做数指定的位数。 | A << 2获得240,即 1111 0000 |
>> | 按位右移运算符。左操做数按位右移右操做数指定的位数。 | A >> 2获得15即 1111 |
>>> | 按位右移补零操做符。左操做数的值按右操做数指定的位数右移,移动获得的空位以零填充。 |
下表列出了逻辑运算符的基本运算,假设布尔变量A为真,变量B为假
操做符 | 描述 | 例子 |
---|---|---|
&& | 称为逻辑与运算符。当且仅当两个操做数都为真,条件才为真。 | (A && B)为假。 |
| | | 称为逻辑或操做符。若是任何两个操做数任何一个为真,条件为真。 | (A | | B)为真。 |
! | 称为逻辑非运算符。用来反转操做数的逻辑状态。若是条件为true,则逻辑非运算符将获得false。 | !(A && B)为真。 |
下面是Java语言支持的赋值运算符:
操做符 | 描述 | 例子 |
---|---|---|
= | 简单的赋值运算符,将右操做数的值赋给左侧操做数 | C = A + B将把A + B获得的值赋给C |
+ = | 加和赋值操做符,它把左操做数和右操做数相加赋值给左操做数 | C + = A等价于C = C + A |
- = | 减和赋值操做符,它把左操做数和右操做数相减赋值给左操做数 | C - = A等价于C = C - A |
* = | 乘和赋值操做符,它把左操做数和右操做数相乘赋值给左操做数 | C * = A等价于C = C * A |
/ = | 除和赋值操做符,它把左操做数和右操做数相除赋值给左操做数 | C / = A等价于C = C / A |
(%)= | 取模和赋值操做符,它把左操做数和右操做数取模后赋值给左操做数 | C%= A等价于C = C%A |
<< = | 左移位赋值运算符 | C << = 2等价于C = C << 2 |
>> = | 右移位赋值运算符 | C >> = 2等价于C = C >> 2 |
&= | 按位与赋值运算符 | C&= 2等价于C = C&2 |
^ = | 按位异或赋值操做符 | C ^ = 2等价于C = C ^ 2 |
| = | 按位或赋值操做符 | C | = 2等价于C = C | 2 |
条件运算符也被称为三元运算符。该运算符有3个操做数,而且须要判断布尔表达式的值。该运算符的主要是决定哪一个值应该赋值给变量。
variable x = (expression) ? value if true : value if false
该运算符用于操做对象实例,检查该对象是不是一个特定类型(类类型或接口类型)。
instanceof运算符使用格式以下:
( Object reference variable ) instanceof (class/interface type)
当多个运算符出如今一个表达式中,谁先谁后呢?这就涉及到运算符的优先级别的问题。在一个多运算符的表达式中,运算符优先级不一样会致使最后得出的结果差异甚大。
例如,(1+3)+(3+2)*2,这个表达式若是按加号最优先计算,答案就是 18,若是按照乘号最优先,答案则是 14。
再如,x = 7 + 3 * 2;这里x获得13,而不是20,由于乘法运算符比加法运算符有较高的优先级,因此先计算3 * 2获得6,而后再加7。
下表中具备最高优先级的运算符在的表的最上面,最低优先级的在表的底部。
类别 | 操做符 | 关联性 |
---|---|---|
后缀 | () [] . (点操做符) | 左到右 |
一元 | + + - !〜 | 从右到左 |
乘性 | * /% | 左到右 |
加性 | + - | 左到右 |
移位 | >> >>> << | 左到右 |
关系 | >> = << = | 左到右 |
相等 | == != | 左到右 |
按位与 | & | 左到右 |
按位异或 | ^ | 左到右 |
按位或 | | | 左到右 |
逻辑与 | && | 左到右 |
逻辑或 | | | | 左到右 |
条件 | ?: | 从右到左 |
赋值 | = + = - = * = / =%= >> = << =&= ^ = | = | 从右到左 |
逗号 | , | 左到右 |
Java中有三种主要的循环结构:
while是最基本的循环,它的结构为:
对于 while 语句而言,若是不知足条件,则不能进入循环。但有时候咱们须要即便不知足条件,也至少执行一次。
do…while 循环和 while 循环类似,不一样的是,do…while 循环至少会执行一次。
do { //代码语句 }while(布尔表达式);
虽然全部循环结构均可以用 while 或者 do...while表示,但 Java 提供了另外一种语句 —— for 循环,使一些循环结构变得更加简单。
for循环执行的次数是在执行前就肯定的。语法格式以下:
关于 for 循环有如下几点说明:
Java5 引入了一种主要用于数组的加强型 for 循环。
Java 加强 for 循环语法格式以下:
声明语句:声明新的局部变量,该变量的类型必须和数组元素的类型匹配。其做用域限定在循环语句块,其值与此时数组元素的值相等。
表达式:表达式是要访问的数组名,或者是返回值为数组的方法。
break 主要用在循环语句或者 switch 语句中,用来跳出整个语句块。
break 跳出最里层的循环,而且继续执行该循环下面的语句。
break 的用法很简单,就是循环结构中的一条语句:
continue 适用于任何循环控制结构中。做用是让程序马上跳转到下一次循环的迭代。
在 for 循环中,continue 语句使程序当即跳转到更新语句。
在 while 或者 do…while 循环中,程序当即跳转到布尔表达式的判断语句。
continue 就是循环体中一条简单的语句:
if 语句的语法以下:
if 语句后面能够跟 else 语句,当 if 语句的布尔表达式值为 false 时,else 语句块会被执行。
if…else 的用法以下:
if 语句后面能够跟 else if…else 语句,这种语句能够检测到多种可能的状况。
使用 if,else if,else 语句的时候,须要注意下面几点:
使用嵌套的 if…else 语句是合法的。也就是说你能够在另外一个 if 或者 else if 语句中使用 if 或者 else if 语句。
嵌套的 if…else 语法格式以下:
switch case 语句语法格式以下:
switch case 语句有以下规则:
switch 语句中的变量类型能够是: byte、short、int 或者 char。从 Java SE 7 开始,switch 支持字符串 String 类型了,同时 case 标签必须为字符串常量或字面量。
switch 语句能够拥有多个 case 语句。每一个 case 后面跟一个要比较的值和冒号。
case 语句中的值的数据类型必须与变量的数据类型相同,并且只能是常量或者字面常量。
当变量的值与 case 语句的值相等时,那么 case 语句以后的语句开始执行,直到 break 语句出现才会跳出 switch 语句。
当遇到 break 语句时,switch 语句终止。程序跳转到 switch 语句后面的语句执行。case 语句没必要需要包含 break 语句。若是没有 break 语句出现,程序会继续执行下一条 case 语句,直到出现 break 语句。
switch 语句能够包含一个 default 分支,该分支通常是 switch 语句的最后一个分支(能够在任何位置,但建议在最后一个)。default 在没有 case 语句的值和变量值相等的时候执行。default 分支不须要 break 语句。
switch case 执行时,必定会先进行匹配,匹配成功返回当前 case 的值,再根据是否有 break,判断是否继续输出,或是跳出判断。
当须要使用数字的时候,咱们一般使用内置数据类型,如:byte、int、long、double 等。
全部的包装类(Integer、Long、Byte、Double、Float、Short)都是抽象类 Number 的子类。
Java 的 Math 包含了用于执行基本数学运算的属性和方法,如初等指数、对数、平方根和三角函数。
Math 的方法都被定义为 static 形式,经过 Math 类能够在主函数中直接调用。
下面的表中列出的是 Number & Math 类经常使用的一些方法:
序号 | 方法与描述 |
---|---|
1 | xxxValue() 将 Number 对象转换为xxx数据类型的值并返回。 |
2 | compareTo() 将number对象与参数比较。 |
3 | equals() 判断number对象是否与参数相等。 |
4 | valueOf() 返回一个 Number 对象指定的内置数据类型 |
5 | toString() 以字符串形式返回值。 |
6 | parseInt() 将字符串解析为int类型。 |
7 | abs() 返回参数的绝对值。 |
8 | ceil() 返回大于等于( >= )给定参数的的最小整数,类型为双精度浮点型。 |
9 | floor() 返回小于等于(<=)给定参数的最大整数 。 |
10 | rint() 返回与参数最接近的整数。返回类型为double。 |
11 | round() 它表示四舍五入,算法为 Math.floor(x+0.5),即将原来的数字加上 0.5 后再向下取整,因此,Math.round(11.5) 的结果为12,Math.round(-11.5) 的结果为-11。 |
12 | min() 返回两个参数中的最小值。 |
13 | max() 返回两个参数中的最大值。 |
14 | exp() 返回天然数底数e的参数次方。 |
15 | log() 返回参数的天然数底数的对数值。 |
16 | pow() 返回第一个参数的第二个参数次方。 |
17 | sqrt() 求参数的算术平方根。 |
18 | sin() 求指定double类型参数的正弦值。 |
19 | cos() 求指定double类型参数的余弦值。 |
20 | tan() 求指定double类型参数的正切值。 |
21 | asin() 求指定double类型参数的反正弦值。 |
22 | acos() 求指定double类型参数的反余弦值。 |
23 | atan() 求指定double类型参数的反正切值。 |
24 | atan2() 将笛卡尔坐标转换为极坐标,并返回极坐标的角度值。 |
25 | toDegrees() 将参数转化为角度。 |
26 | toRadians() 将角度转换为弧度。 |
27 | random() 返回一个随机数。 |
参数 | Math.floor | Math.round | Math.ceil |
---|---|---|---|
1.4 | 1 | 1 | 2 |
1.5 | 1 | 2 | 2 |
1.6 | 1 | 2 | 2 |
-1.4 | -2 | -1 | -1 |
-1.5 | -2 | -1 | -1 |
-1.6 | -2 | -2 | -1 |
Character 类用于对单个字符进行操做。
Character 类在对象中包装一个基本类型 char 的值
前面有反斜杠(\)的字符表明转义字符,它对编译器来讲是有特殊含义的。
下面列表展现了Java的转义序列:
转义序列 | 描述 |
---|---|
\t | 在文中该处插入一个tab键 |
\b | 在文中该处插入一个后退键 |
\n | 在文中该处换行 |
\r | 在文中该处插入回车 |
\f | 在文中该处插入换页符 |
\' | 在文中该处插入单引号 |
\" | 在文中该处插入双引号 |
\\ | 在文中该处插入反斜杠 |
下面是Character类的方法:
序号 | 方法与描述 |
---|---|
1 | isLetter() 是不是一个字母 |
2 | isDigit() 是不是一个数字字符 |
3 | isWhitespace() 是不是一个空白字符 |
4 | isUpperCase() 是不是大写字母 |
5 | isLowerCase() 是不是小写字母 |
6 | toUpperCase() 指定字母的大写形式 |
7 | toLowerCase() 指定字母的小写形式 |
8 | toString() 返回字符的字符串形式,字符串的长度仅为1 |
字符串普遍应用 在 Java 编程中,在 Java 中字符串属于对象,Java 提供了 String 类来建立和操做字符串。
建立字符串最简单的方式以下:
用于获取有关对象的信息的方法称为访问器方法。
String 类的一个访问器方法是 length() 方法,它返回字符串对象包含的字符数。
咱们知道输出格式化数字可使用 printf() 和 format() 方法。
String 类使用静态方法 format() 返回一个String 对象而不是 PrintStream 对象。
String 类的静态方法 format() 能用来建立可复用的格式化字符串,而不只仅是用于一次打印输出。
下面是 String 类支持的方法,更多详细,参看 Java String API 文档:
当对字符串进行修改的时候,须要使用 StringBuffer 和 StringBuilder 类。
和 String 类不一样的是,StringBuffer 和 StringBuilder 类的对象可以被屡次的修改,而且不产生新的未使用对象。
StringBuilder 类在 Java 5 中被提出,它和 StringBuffer 之间的最大不一样在于 StringBuilder 的方法不是线程安全的(不能同步访问)。
因为 StringBuilder 相较于 StringBuffer 有速度优点,因此多数状况下建议使用 StringBuilder 类。然而在应用程序要求线程安全的状况下,则必须使用 StringBuffer 类。
如下是 StringBuffer 类支持的主要方法:
序号 | 方法描述 |
---|---|
1 | public StringBuffer append(String s) 将指定的字符串追加到此字符序列。 |
2 | public StringBuffer reverse() 将此字符序列用其反转形式取代。 |
3 | public delete(int start, int end) 移除此序列的子字符串中的字符。 |
4 | public insert(int offset, int i) 将 int 参数的字符串表示形式插入此序列中。 |
5 | replace(int start, int end, String str) 使用给定 String 中的字符替换此序列的子字符串中的字符。 |
下面的列表里的方法和 String 类的方法相似:
序号 | 方法描述 |
---|---|
1 | int capacity() 返回当前容量。 |
2 | char charAt(int index) 返回此序列中指定索引处的 char 值。 |
3 | void ensureCapacity(int minimumCapacity) 确保容量至少等于指定的最小值。 |
4 | void getChars(int srcBegin, int srcEnd, char[] dst, int dstBegin) 将字符今后序列复制到目标字符数组 dst 。 |
5 | int indexOf(String str) 返回第一次出现的指定子字符串在该字符串中的索引。 |
6 | int indexOf(String str, int fromIndex) 从指定的索引处开始,返回第一次出现的指定子字符串在该字符串中的索引。 |
7 | int lastIndexOf(String str) 返回最右边出现的指定子字符串在此字符串中的索引。 |
8 | int lastIndexOf(String str, int fromIndex) 返回 String 对象中子字符串最后出现的位置。 |
9 | int length() 返回长度(字符数)。 |
10 | void setCharAt(int index, char ch) 将给定索引处的字符设置为 ch 。 |
11 | void setLength(int newLength) 设置字符序列的长度。 |
12 | CharSequence subSequence(int start, int end) 返回一个新的字符序列,该字符序列是此序列的子序列。 |
13 | String substring(int start) 返回一个新的 String ,它包含此字符序列当前所包含的字符子序列。 |
14 | String substring(int start, int end) 返回一个新的 String ,它包含此序列当前所包含的字符子序列。 |
15 | String toString() 返回此序列中数据的字符串表示形式。 |
首先必须声明数组变量,才能在程序中使用数组。下面是声明数组变量的语法:
Java语言使用new操做符来建立数组,语法以下:
arrayRefVar = new dataType[arraySize];
数组的元素类型和数组的大小都是肯定的,因此当处理数组元素时候,咱们一般使用基本循环或者 For-Each 循环。
JDK 1.5 引进了一种新的循环类型,被称为 For-Each 循环或者增强型循环,它能在不使用下标的状况下遍历数组。
数组能够做为参数传递给方法。
多维数组能够当作是数组的数组,好比二维数组就是一个特殊的一维数组,其每个元素都是一个一维数组,例如:
1. 直接为每一维分配空间,格式以下:
type 能够为基本数据类型和复合数据类型,arraylength1 和 arraylength2 必须为正整数,arraylength1 为行数,arraylength2 为列数。
例如:
java.util.Arrays 类能方便地操做数组,它提供的全部方法都是静态的。
具备如下功能:
具体说明请查看下表:
序号 | 方法和说明 |
---|---|
1 | public static int binarySearch(Object[] a, Object key) 用二分查找算法在给定数组中搜索给定值的对象(Byte,Int,double等)。数组在调用前必须排序好的。若是查找值包含在数组中,则返回搜索键的索引;不然返回 (-(插入点) - 1)。 |
2 | public static boolean equals(long[] a, long[] a2) 若是两个指定的 long 型数组彼此相等,则返回 true。若是两个数组包含相同数量的元素,而且两个数组中的全部相应元素对都是相等的,则认为这两个数组是相等的。换句话说,若是两个数组以相同顺序包含相同的元素,则两个数组是相等的。一样的方法适用于全部的其余基本数据类型(Byte,short,Int等)。 |
3 | public static void fill(int[] a, int val) 将指定的 int 值分配给指定 int 型数组指定范围中的每一个元素。一样的方法适用于全部的其余基本数据类型(Byte,short,Int等)。 |
4 | public static void sort(Object[] a) 对指定对象数组根据其元素的天然顺序进行升序排列。一样的方法适用于全部的其余基本数据类型(Byte,short,Int等)。 |
java.util 包提供了 Date 类来封装当前的日期和时间。 Date 类提供两个构造函数来实例化 Date 对象。
第一个构造函数使用当前日期和时间来初始化对象。
第二个构造函数接收一个参数,该参数是从1970年1月1日起的毫秒数。
Date对象建立之后,能够调用下面的方法。
序号 | 方法和描述 |
---|---|
1 | boolean after(Date date) 若当调用此方法的Date对象在指定日期以后返回true,不然返回false。 |
2 | boolean before(Date date) 若当调用此方法的Date对象在指定日期以前返回true,不然返回false。 |
3 | Object clone( ) 返回此对象的副本。 |
4 | int compareTo(Date date) 比较当调用此方法的Date对象和指定日期。二者相等时候返回0。调用对象在指定日期以前则返回负数。调用对象在指定日期以后则返回正数。 |
5 | int compareTo(Object obj) 若obj是Date类型则操做等同于compareTo(Date) 。不然它抛出ClassCastException。 |
6 | boolean equals(Object date) 当调用此方法的Date对象和指定日期相等时候返回true,不然返回false。 |
7 | long getTime( ) 返回自 1970 年 1 月 1 日 00:00:00 GMT 以来此 Date 对象表示的毫秒数。 |
8 | int hashCode( ) 返回此对象的哈希码值。 |
9 | void setTime(long time) 用自1970年1月1日00:00:00 GMT之后time毫秒数设置时间和日期。 |
10 | String toString( ) 把此 Date 对象转换为如下形式的 String: dow mon dd hh:mm:ss zzz yyyy 其中: dow 是一周中的某一天 (Sun, Mon, Tue, Wed, Thu, Fri, Sat)。 |
正则表达式定义了字符串的模式。
正则表达式能够用来搜索、编辑或处理文本。
正则表达式并不只限于某一种语言,可是在每种语言中有细微的差异。
一个字符串其实就是一个简单的正则表达式,例如 Hello World 正则表达式匹配 "Hello World" 字符串。
.(点号)也是一个正则表达式,它匹配任何一个字符如:"a" 或 "1"。
下表列出了一些正则表达式的实例及描述:
正则表达式 | 描述 |
---|---|
this is text |
匹配字符串 "this is text" |
this\s+is\s+text |
注意字符串中的 \s+。 匹配单词 "this" 后面的 \s+ 能够匹配多个空格,以后匹配 is 字符串,再以后 \s+ 匹配多个空格而后再跟上 text 字符串。 能够匹配这个实例:this is text |
^\d+(\.\d+)? |
^ 定义了以什么开始 \d+ 匹配一个或多个数字 ? 设置括号内的选项是可选的 \. 匹配 "." 能够匹配的实例:"5", "1.5" 和 "2.21"。 |
Java 正则表达式和 Perl 的是最为类似的。
java.util.regex 包主要包括如下三个类:
pattern 对象是一个正则表达式的编译表示。Pattern 类没有公共构造方法。要建立一个 Pattern 对象,你必须首先调用其公共静态编译方法,它返回一个 Pattern 对象。该方法接受一个正则表达式做为它的第一个参数。
Matcher 对象是对输入字符串进行解释和匹配操做的引擎。与Pattern 类同样,Matcher 也没有公共构造方法。你须要调用 Pattern 对象的 matcher 方法来得到一个 Matcher 对象。
PatternSyntaxException 是一个非强制异常类,它表示一个正则表达式模式中的语法错误。
捕获组是把多个字符当一个单独单元进行处理的方法,它经过对括号内的字符分组来建立。
例如,正则表达式 (dog) 建立了单一分组,组里包含"d","o",和"g"。
捕获组是经过从左至右计算其开括号来编号。例如,在表达式((A)(B(C))),有四个这样的组:
能够经过调用 matcher 对象的 groupCount 方法来查看表达式有多少个分组。groupCount 方法返回一个 int 值,表示matcher对象当前有多个捕获组。
还有一个特殊的组(group(0)),它老是表明整个表达式。该组不包括在 groupCount 的返回值中。
在其余语言中,\\ 表示:我想要在正则表达式中插入一个普通的(字面上的)反斜杠,请不要给它任何特殊的意义。
在 Java 中,\\ 表示:我要插入一个正则表达式的反斜线,因此其后的字符具备特殊的意义。
因此,在其余的语言中(如Perl),一个反斜杠 \ 就足以具备转义的做用,而在 Java 中正则表达式中则须要有两个反斜杠才能被解析为其余语言中的转义做用。也能够简单的理解在 Java 的正则表达式中,两个 \\ 表明其余语言中的一个 \,这也就是为何表示一位数字的正则表达式是 \\d,而表示一个普通的反斜杠是 \\\\。
字符 |
说明 |
---|---|
\ |
将下一字符标记为特殊字符、文本、反向引用或八进制转义符。例如,"n"匹配字符"n"。"\n"匹配换行符。序列"\\\\"匹配"\\","\\("匹配"("。 |
^ |
匹配输入字符串开始的位置。若是设置了 RegExp 对象的 Multiline 属性,^ 还会与"\n"或"\r"以后的位置匹配。 |
$ |
匹配输入字符串结尾的位置。若是设置了 RegExp 对象的 Multiline 属性,$ 还会与"\n"或"\r"以前的位置匹配。 |
* |
零次或屡次匹配前面的字符或子表达式。例如,zo* 匹配"z"和"zoo"。* 等效于 {0,}。 |
+ |
一次或屡次匹配前面的字符或子表达式。例如,"zo+"与"zo"和"zoo"匹配,但与"z"不匹配。+ 等效于 {1,}。 |
? |
零次或一次匹配前面的字符或子表达式。例如,"do(es)?"匹配"do"或"does"中的"do"。? 等效于 {0,1}。 |
{n} |
n 是非负整数。正好匹配 n 次。例如,"o{2}"与"Bob"中的"o"不匹配,但与"food"中的两个"o"匹配。 |
{n,} |
n 是非负整数。至少匹配 n 次。例如,"o{2,}"不匹配"Bob"中的"o",而匹配"foooood"中的全部 o。"o{1,}"等效于"o+"。"o{0,}"等效于"o*"。 |
{n,m} |
m 和 n 是非负整数,其中 n <= m。匹配至少 n 次,至多 m 次。例如,"o{1,3}"匹配"fooooood"中的头三个 o。'o{0,1}' 等效于 'o?'。注意:您不能将空格插入逗号和数字之间。 |
? |
当此字符紧随任何其余限定符(*、+、?、{n}、{n,}、{n,m})以后时,匹配模式是"非贪心的"。"非贪心的"模式匹配搜索到的、尽量短的字符串,而默认的"贪心的"模式匹配搜索到的、尽量长的字符串。例如,在字符串"oooo"中,"o+?"只匹配单个"o",而"o+"匹配全部"o"。 |
. |
匹配除"\r\n"以外的任何单个字符。若要匹配包括"\r\n"在内的任意字符,请使用诸如"[\s\S]"之类的模式。 |
(pattern) |
匹配 pattern 并捕获该匹配的子表达式。可使用 $0…$9 属性从结果"匹配"集合中检索捕获的匹配。若要匹配括号字符 ( ),请使用"\("或者"\)"。 |
(?:pattern) |
匹配 pattern 但不捕获该匹配的子表达式,即它是一个非捕获匹配,不存储供之后使用的匹配。这对于用"or"字符 (|) 组合模式部件的状况颇有用。例如,'industr(?:y|ies) 是比 'industry|industries' 更经济的表达式。 |
(?=pattern) |
执行正向预测先行搜索的子表达式,该表达式匹配处于匹配 pattern 的字符串的起始点的字符串。它是一个非捕获匹配,即不能捕获供之后使用的匹配。例如,'Windows (?=95|98|NT|2000)' 匹配"Windows 2000"中的"Windows",但不匹配"Windows 3.1"中的"Windows"。预测先行不占用字符,即发生匹配后,下一匹配的搜索紧随上一匹配以后,而不是在组成预测先行的字符后。 |
(?!pattern) |
执行反向预测先行搜索的子表达式,该表达式匹配不处于匹配 pattern 的字符串的起始点的搜索字符串。它是一个非捕获匹配,即不能捕获供之后使用的匹配。例如,'Windows (?!95|98|NT|2000)' 匹配"Windows 3.1"中的 "Windows",但不匹配"Windows 2000"中的"Windows"。预测先行不占用字符,即发生匹配后,下一匹配的搜索紧随上一匹配以后,而不是在组成预测先行的字符后。 |
x|y |
匹配 x 或 y。例如,'z|food' 匹配"z"或"food"。'(z|f)ood' 匹配"zood"或"food"。 |
[xyz] |
字符集。匹配包含的任一字符。例如,"[abc]"匹配"plain"中的"a"。 |
[^xyz] |
反向字符集。匹配未包含的任何字符。例如,"[^abc]"匹配"plain"中"p","l","i","n"。 |
[a-z] |
字符范围。匹配指定范围内的任何字符。例如,"[a-z]"匹配"a"到"z"范围内的任何小写字母。 |
[^a-z] |
反向范围字符。匹配不在指定的范围内的任何字符。例如,"[^a-z]"匹配任何不在"a"到"z"范围内的任何字符。 |
\b |
匹配一个字边界,即字与空格间的位置。例如,"er\b"匹配"never"中的"er",但不匹配"verb"中的"er"。 |
\B |
非字边界匹配。"er\B"匹配"verb"中的"er",但不匹配"never"中的"er"。 |
\cx |
匹配 x 指示的控制字符。例如,\cM 匹配 Control-M 或回车符。x 的值必须在 A-Z 或 a-z 之间。若是不是这样,则假定 c 就是"c"字符自己。 |
\d |
数字字符匹配。等效于 [0-9]。 |
\D |
非数字字符匹配。等效于 [^0-9]。 |
\f |
换页符匹配。等效于 \x0c 和 \cL。 |
\n |
换行符匹配。等效于 \x0a 和 \cJ。 |
\r |
匹配一个回车符。等效于 \x0d 和 \cM。 |
\s |
匹配任何空白字符,包括空格、制表符、换页符等。与 [ \f\n\r\t\v] 等效。 |
\S |
匹配任何非空白字符。与 [^ \f\n\r\t\v] 等效。 |
\t |
制表符匹配。与 \x09 和 \cI 等效。 |
\v |
垂直制表符匹配。与 \x0b 和 \cK 等效。 |
\w |
匹配任何字类字符,包括下划线。与"[A-Za-z0-9_]"等效。 |
\W |
与任何非单词字符匹配。与"[^A-Za-z0-9_]"等效。 |
\xn |
匹配 n,此处的 n 是一个十六进制转义码。十六进制转义码必须正好是两位数长。例如,"\x41"匹配"A"。"\x041"与"\x04"&"1"等效。容许在正则表达式中使用 ASCII 代码。 |
\num |
匹配 num,此处的 num 是一个正整数。到捕获匹配的反向引用。例如,"(.)\1"匹配两个连续的相同字符。 |
\n |
标识一个八进制转义码或反向引用。若是 \n 前面至少有 n 个捕获子表达式,那么 n 是反向引用。不然,若是 n 是八进制数 (0-7),那么 n 是八进制转义码。 |
\nm |
标识一个八进制转义码或反向引用。若是 \nm 前面至少有 nm 个捕获子表达式,那么 nm 是反向引用。若是 \nm前面至少有 n 个捕获,则 n 是反向引用,后面跟有字符 m。若是两种前面的状况都不存在,则 \nm 匹配八进制值 nm,其中 n 和 m 是八进制数字 (0-7)。 |
\nml |
当 n 是八进制数 (0-3),m 和 l 是八进制数 (0-7) 时,匹配八进制转义码 nml。 |
\un |
匹配 n,其中 n 是以四位十六进制数表示的 Unicode 字符。例如,\u00A9 匹配版权符号 (©)。 |
根据 Java Language Specification 的要求,Java 源代码的字符串中的反斜线被解释为 Unicode 转义或其余字符转义。所以必须在字符串字面值中使用两个反斜线,表示正则表达式受到保护,不被 Java 字节码编译器解释。例如,当解释为正则表达式时,字符串字面值 "\b" 与单个退格字符匹配,而 "\\b" 与单词边界匹配。字符串字面值 "\(hello\)" 是非法的,将致使编译时错误;要与字符串 (hello) 匹配,必须使用字符串字面值 "\\(hello\\)"。
索引方法提供了有用的索引值,精确代表输入字符串中在哪能找到匹配:
序号 | 方法及说明 |
---|---|
1 | public int start() 返回之前匹配的初始索引。 |
2 | public int start(int group) 返回在之前的匹配操做期间,由给定组所捕获的子序列的初始索引 |
3 | public int end() 返回最后匹配字符以后的偏移量。 |
4 | public int end(int group) 返回在之前的匹配操做期间,由给定组所捕获子序列的最后字符以后的偏移量。 |
研究方法用来检查输入字符串并返回一个布尔值,表示是否找到该模式:
序号 | 方法及说明 |
---|---|
1 | public boolean lookingAt() 尝试将从区域开头开始的输入序列与该模式匹配。 |
2 | public boolean find() 尝试查找与该模式匹配的输入序列的下一个子序列。 |
3 | public boolean find(int start) 重置此匹配器,而后尝试查找匹配该模式、从指定索引开始的输入序列的下一个子序列。 |
4 | public boolean matches() 尝试将整个区域与模式匹配。 |
替换方法是替换输入字符串里文本的方法:
序号 | 方法及说明 |
---|---|
1 | public Matcher appendReplacement(StringBuffer sb, String replacement) 实现非终端添加和替换步骤。 |
2 | public StringBuffer appendTail(StringBuffer sb) 实现终端添加和替换步骤。 |
3 | public String replaceAll(String replacement) 替换模式与给定替换字符串相匹配的输入序列的每一个子序列。 |
4 | public String replaceFirst(String replacement) 替换模式与给定替换字符串匹配的输入序列的第一个子序列。 |
5 | public static String quoteReplacement(String s) 返回指定字符串的字面替换字符串。这个方法返回一个字符串,就像传递给Matcher类的appendReplacement 方法一个字面字符串同样工做。 |
Java方法是语句的集合,它们在一块儿执行一个功能。
通常状况下,定义一个方法包含如下语法:
方法包含一个方法头和一个方法体。下面是一个方法的全部部分:
Java 支持两种调用方法的方式,根据方法是否返回值来选择。
当程序调用一个方法时,程序的控制权交给了被调用的方法。当被调用方法的返回语句执行或者到达方法体闭括号时候交还控制权给程序。
调用一个方法时候须要提供参数,你必须按照参数列表指定的顺序提供。
变量的范围是程序中该变量能够被引用的部分。
方法内定义的变量被称为局部变量。
局部变量的做用范围从声明开始,直到包含它的块结束。
局部变量必须声明才可使用。
方法的参数范围涵盖整个方法。参数其实是一个局部变量。
for循环的初始化部分声明的变量,其做用范围在整个循环。
但循环体内声明的变量其适用范围是从它声明到循环体结束。它包含以下所示的变量声明:
你能够在一个方法里,不一样的非嵌套块中屡次声明一个具备相同的名称局部变量,但你不能在嵌套块内两次声明局部变量。
有时候你但愿运行一个程序时候再传递给它消息。这要靠传递命令行参数给main()函数实现。
命令行参数是在执行程序时候紧跟在程序名字后面的信息。
当一个对象被建立时候,构造方法用来初始化该对象。构造方法和它所在类的名字相同,但构造方法没有返回值。
一般会使用构造方法给一个类的实例变量赋初值,或者执行其它必要的步骤来建立一个完整的对象。
无论你是否自定义构造方法,全部的类都有构造方法,由于Java自动提供了一个默认构造方法,默认构造方法的访问修改符和类的访问修改符相同(类为 public,构造函数也为 public;类改成 private,构造函数也改成 private)。
一旦你定义了本身的构造方法,默认构造方法就会失效。
JDK 1.5 开始,Java支持传递同类型的可变参数给一个方法。
Java 容许定义这样的方法,它在对象被垃圾收集器析构(回收)以前调用,这个方法叫作 finalize( ),它用来清除回收对象。
例如,你可使用 finalize() 来确保一个对象打开的文件被关闭了。
在 finalize() 方法里,你必须指定在对象销毁时候要执行的操做。
finalize() 通常格式是:
关键字 protected 是一个限定符,它确保 finalize() 方法不会被该类之外的代码调用。
Java.io 包几乎包含了全部操做输入、输出须要的类。全部这些流类表明了输入源和输出目标。
Java.io 包中的流支持不少种格式,好比:基本类型、对象、本地化字符集等等。
一个流能够理解为一个数据的序列。输入流表示从一个源读取数据,输出流表示向一个目标写数据。
Java 为 I/O 提供了强大的而灵活的支持,使其更普遍地应用到文件传输和网络编程中。
但本节讲述最基本的和流与 I/O 相关的功能。咱们将经过一个个例子来学习这些功能。
Java 的控制台输入由 System.in 完成。
为了得到一个绑定到控制台的字符流,你能够把 System.in 包装在一个 BufferedReader 对象中来建立一个字符流。
下面是建立 BufferedReader 的基本语法:
BufferedReader 对象建立后,咱们即可以使用 read() 方法从控制台读取一个字符,或者用 readLine() 方法读取一个字符串。
从 BufferedReader 对象读取一个字符要使用 read() 方法,它的语法以下:
每次调用 read() 方法,它从输入流读取一个字符并把该字符做为整数值返回。 当流结束的时候返回 -1。该方法抛出 IOException。
从标准输入读取一个字符串须要使用 BufferedReader 的 readLine() 方法。
它的通常格式是:
在此前已经介绍过,控制台的输出由 print( ) 和 println() 完成。这些方法都由类 PrintStream 定义,System.out 是该类对象的一个引用。
PrintStream 继承了 OutputStream类,而且实现了方法 write()。这样,write() 也能够用来往控制台写操做。
PrintStream 定义 write() 的最简单格式以下所示:
该方法将 byteval 的低八位字节写到流中。
如前所述,一个流被定义为一个数据序列。输入流用于从源读取数据,输出流用于向目标写数据。
下图是一个描述输入流和输出流的类层次图。
下面将要讨论的两个重要的流是 FileInputStream 和 FileOutputStream:
该流用于从文件读取数据,它的对象能够用关键字 new 来建立。
有多种构造方法可用来建立对象。
可使用字符串类型的文件名来建立一个输入流对象来读取文件:
也可使用一个文件对象来建立一个输入流对象来读取文件。咱们首先得使用 File() 方法来建立一个文件对象:
建立了InputStream对象,就可使用下面的方法来读取流或者进行其余的流操做。
序号 | 方法及描述 |
---|---|
1 | public void close() throws IOException{} 关闭此文件输入流并释放与此流有关的全部系统资源。抛出IOException异常。 |
2 | protected void finalize()throws IOException {} 这个方法清除与该文件的链接。确保在再也不引用文件输入流时调用其 close 方法。抛出IOException异常。 |
3 | public int read(int r)throws IOException{} 这个方法从 InputStream 对象读取指定字节的数据。返回为整数值。返回下一字节数据,若是已经到结尾则返回-1。 |
4 | public int read(byte[] r) throws IOException{} 这个方法从输入流读取r.length长度的字节。返回读取的字节数。若是是文件结尾则返回-1。 |
5 | public int available() throws IOException{} 返回下一次对此输入流调用的方法能够不受阻塞地今后输入流读取的字节数。返回一个整数值。 |
除了 InputStream 外,还有一些其余的输入流,更多的细节参考下面连接:
该类用来建立一个文件并向文件中写数据。
若是该流在打开文件进行输出前,目标文件不存在,那么该流会建立该文件。
有两个构造方法能够用来建立 FileOutputStream 对象。
使用字符串类型的文件名来建立一个输出流对象:
也可使用一个文件对象来建立一个输出流来写文件。咱们首先得使用File()方法来建立一个文件对象:
建立OutputStream 对象完成后,就可使用下面的方法来写入流或者进行其余的流操做。
序号 | 方法及描述 |
---|---|
1 | public void close() throws IOException{} 关闭此文件输入流并释放与此流有关的全部系统资源。抛出IOException异常。 |
2 | protected void finalize()throws IOException {} 这个方法清除与该文件的链接。确保在再也不引用文件输入流时调用其 close 方法。抛出IOException异常。 |
3 | public void write(int w)throws IOException{} 这个方法把指定的字节写到输出流中。 |
4 | public void write(byte[] w) 把指定数组中w.length长度的字节写到OutputStream中。 |
java.util.Scanner 是 Java5 的新特征,咱们能够经过 Scanner 类来获取用户的输入。
下面是建立 Scanner 对象的基本语法:
接下来咱们演示一个最简单的数据输入,并经过 Scanner 类的 next() 与 nextLine() 方法获取输入的字符串,在读取前咱们通常须要 使用 hasNext 与 hasNextLine 判断是否还有输入的数据:
执行以上程序输出结果为:
$ javac ScannerDemo.java $ java ScannerDemo next方式接收: runoob com 输入的数据为:runoob
执行以上程序输出结果为:
$ javac ScannerDemo.java $ java ScannerDemo nextLine方式接收: runoob com 输入的数据为:runoob com
能够看到 com 字符串输出。
next():
nextLine():
若是要输入 int 或 float 类型的数据,在 Scanner 类中也有支持,可是在输入以前最好先使用 hasNextXxx() 方法进行验证,再使用 nextXxx() 来读取:
执行以上程序输出结果为:
$ javac ScannerDemo.java $ java ScannerDemo 输入整数:12 整数数据:12 输入小数:1.2 小数数据:1.2
如下实例咱们能够输入多个数字,并求其总和与平均数,每输入一个数字用回车确认,经过输入非数字来结束输入并输出执行结果:
执行以上程序输出结果为:
$ javac ScannerDemo.java $ java ScannerDemo 12 23 15 21.4 end 4个数的和为71.4 4个数的平均值是17.85
异常是程序中的一些错误,但并非全部的错误都是异常,而且错误有时候是能够避免的。
好比说,你的代码少了一个分号,那么运行出来结果是提示是错误 java.lang.Error;若是你用System.out.println(11/0),那么你是由于你用0作了除数,会抛出 java.lang.ArithmeticException 的异常。
异常发生的缘由有不少,一般包含如下几大类:
这些异常有的是由于用户错误引发,有的是程序错误引发的,还有其它一些是由于物理错误引发的。-
要理解Java异常处理是如何工做的,你须要掌握如下三种类型的异常:
全部的异常类是从 java.lang.Exception 类继承的子类。
Exception 类是 Throwable 类的子类。除了Exception类外,Throwable还有一个子类Error 。
Java 程序一般不捕获错误。错误通常发生在严重故障时,它们在Java程序处理的范畴以外。
Error 用来指示运行时环境发生的错误。
例如,JVM 内存溢出。通常地,程序不会从错误中恢复。
异常类有两个主要的子类:IOException 类和 RuntimeException 类。
在 Java 内置类中(接下来会说明),有大部分经常使用检查性和非检查性异常。
Java 语言定义了一些异常类在 java.lang 标准包中。
标准运行时异常类的子类是最多见的异常类。因为 java.lang 包是默认加载到全部的 Java 程序的,因此大部分从运行时异常类继承而来的异常均可以直接使用。
Java 根据各个类库也定义了一些其余的异常,下面的表中列出了 Java 的非检查性异常。
异常 | 描述 |
---|---|
ArithmeticException | 当出现异常的运算条件时,抛出此异常。例如,一个整数"除以零"时,抛出此类的一个实例。 |
ArrayIndexOutOfBoundsException | 用非法索引访问数组时抛出的异常。若是索引为负或大于等于数组大小,则该索引为非法索引。 |
ArrayStoreException | 试图将错误类型的对象存储到一个对象数组时抛出的异常。 |
ClassCastException | 当试图将对象强制转换为不是实例的子类时,抛出该异常。 |
IllegalArgumentException | 抛出的异常代表向方法传递了一个不合法或不正确的参数。 |
IllegalMonitorStateException | 抛出的异常代表某一线程已经试图等待对象的监视器,或者试图通知其余正在等待对象的监视器而自己没有指定监视器的线程。 |
IllegalStateException | 在非法或不适当的时间调用方法时产生的信号。换句话说,即 Java 环境或 Java 应用程序没有处于请求操做所要求的适当状态下。 |
IllegalThreadStateException | 线程没有处于请求操做所要求的适当状态时抛出的异常。 |
IndexOutOfBoundsException | 指示某排序索引(例如对数组、字符串或向量的排序)超出范围时抛出。 |
NegativeArraySizeException | 若是应用程序试图建立大小为负的数组,则抛出该异常。 |
NullPointerException | 当应用程序试图在须要对象的地方使用 null 时,抛出该异常 |
NumberFormatException | 当应用程序试图将字符串转换成一种数值类型,但该字符串不能转换为适当格式时,抛出该异常。 |
SecurityException | 由安全管理器抛出的异常,指示存在安全侵犯。 |
StringIndexOutOfBoundsException | 此异常由 String 方法抛出,指示索引或者为负,或者超出字符串的大小。 |
UnsupportedOperationException | 当不支持请求的操做时,抛出该异常。 |
下面的表中列出了 Java 定义在 java.lang 包中的检查性异常类。
异常 | 描述 |
---|---|
ClassNotFoundException | 应用程序试图加载类时,找不到相应的类,抛出该异常。 |
CloneNotSupportedException | 当调用 Object 类中的 clone 方法克隆对象,但该对象的类没法实现 Cloneable 接口时,抛出该异常。 |
IllegalAccessException | 拒绝访问一个类的时候,抛出该异常。 |
InstantiationException | 当试图使用 Class 类中的 newInstance 方法建立一个类的实例,而指定的类对象由于是一个接口或是一个抽象类而没法实例化时,抛出该异常。 |
InterruptedException | 一个线程被另外一个线程中断,抛出该异常。 |
NoSuchFieldException | 请求的变量不存在 |
NoSuchMethodException | 请求的方法不存在 |
下面的列表是 Throwable 类的主要方法:
序号 | 方法及说明 |
---|---|
1 | public String getMessage() 返回关于发生的异常的详细信息。这个消息在Throwable 类的构造函数中初始化了。 |
2 | public Throwable getCause() 返回一个Throwable 对象表明异常缘由。 |
3 | public String toString() 使用getMessage()的结果返回类的串级名字。 |
4 | public void printStackTrace() 打印toString()结果和栈层次到System.err,即错误输出流。 |
5 | public StackTraceElement [] getStackTrace() 返回一个包含堆栈层次的数组。下标为0的元素表明栈顶,最后一个元素表明方法调用堆栈的栈底。 |
6 | public Throwable fillInStackTrace() 用当前的调用栈层次填充Throwable 对象栈层次,添加到栈层次任何先前信息中。 |
使用 try 和 catch 关键字能够捕获异常。try/catch 代码块放在异常可能发生的地方。
try/catch代码块中的代码称为保护代码,使用 try/catch 的语法以下:
try { // 程序代码 }catch(ExceptionName e1) { //Catch 块 }
Catch 语句包含要捕获异常类型的声明。当保护代码块中发生一个异常时,try 后面的 catch 块就会被检查。
若是发生的异常包含在 catch 块中,异常会被传递到该 catch 块,这和传递一个参数到方法是同样。
一个 try 代码块后面跟随多个 catch 代码块的状况就叫多重捕获。
多重捕获块的语法以下所示:
上面的代码段包含了 3 个 catch块。
能够在 try 语句后面添加任意数量的 catch 块。
若是保护代码中发生异常,异常被抛给第一个 catch 块。
若是抛出异常的数据类型与 ExceptionType1 匹配,它在这里就会被捕获。
若是不匹配,它会被传递给第二个 catch 块。
如此,直到异常被捕获或者经过全部的 catch 块。
若是一个方法没有捕获到一个检查性异常,那么该方法必须使用 throws 关键字来声明。throws 关键字放在方法签名的尾部。
也可使用 throw 关键字抛出一个异常,不管它是新实例化的仍是刚捕获到的。
下面方法的声明抛出一个 RemoteException 异常:
一个方法能够声明抛出多个异常,多个异常之间用逗号隔开。
finally 关键字用来建立在 try 代码块后面执行的代码块。
不管是否发生异常,finally 代码块中的代码总会被执行。
在 finally 代码块中,能够运行清理类型等收尾善后性质的语句。
finally 代码块出如今 catch 代码块最后,语法以下:
注意下面事项:
在 Java 中你能够自定义异常。编写本身的异常类时须要记住下面的几点。
能够像下面这样定义本身的异常类:
只继承Exception 类来建立的异常类是检查性异常类。
下面的 InsufficientFundsException 类是用户定义的异常类,它继承自 Exception。
一个异常类和其它任何类同样,包含有变量和方法。
在Java中定义了两种类型的异常和错误。