第 3 章 Java的基本语法
2012-3-7 Java面向对象程序设计教程 2
主要内容
? 3.1 类型、值与基本变量
? 3.1.1 基本概念
? 3.1.2 基本类型
? 3.1.3 引用类型
? 3.1.4 类型转换
? 3.2 运算符与表达式
? 3.2.1 算术运算符与表达式
? 3.2.2 关系运算符与表达式
? 3.2.3 逻辑运算符与表达式
? 3.2.4 位运算符与表达式
? 3.2.5 条件运算符与表达式
? 3.2.6 赋值运算符与表达式
? 3.2.7 instanceof运算符
? 3.2.8 运算符优先级与赋值顺序的理解
? 3.2.9 基本类型所支持的操作运算
? 3.3 语句
? 3.3.1 编组语句
? 3.3.2 表达式语句
? 3.3.3 选择语句
? 3.3.4 循环语句
? 3.3.5 迭代与递归
? 3.3.6 控制转移语句
? 3.3.7 注释语句
3.1 类型、值与基本变量
2012-3-7 Java面向对象程序设计教程 4
基本概念:字符集
? ASCII( American Standard Code for Information
Interchange)字符集:使用 7位代码表示大小写字母、
数字 0~9以及若干控制字符,如 NUL和 EOT。
? ISO8859-1 Latin-1字符集:在西欧,用户希望字符集
能够表示他们本国字符集的所有字符,ASCII字符集因而
被扩展到 8位,即增加了 128个字符,用于表示英文中不
存在的各种西欧语言的字符。
? Unicode字符集:是 ISO标准 16位字符集,支持 65536
个不同的字符。其中大约有 21000个字符专门用于中文、
日文和韩文的表意文字。
? ASCII,ISO Latin-1都是 Unicode的子集。
? Java内部使用 2个字节表示每个字符,采用 Unicode编码。
2012-3-7 Java面向对象程序设计教程 5
基本概念:关键字、值、标识符
? 关键字( Keyword),也称保留字( Reserved word),
全部由小写的英文字母所组成。关键字总共有 50多个,其
中一些留作将来供语言设计者扩充语言功能时使用。
? 值 ( Literal):是指不能由程序员规定的代表某一特定
常量或数字的可知的或未知的字母或符号,一般译作, 直
接量, 或, 字面值,,实际上泛指赋给各种不同类型(常
指基本类型、字符串类型、空类型等)的有效值。本书将
它简称为, 值,,而另一个单词, Value‖则称为, 数值, 。
? 标识符( Identifier):是程序员提供的名字,在 Java中,
标识符的长度不受限制,但必须以字母、下划线或 $符号
开始,随后位置也可以包含数字。
? Java标识符支持几万个 Unicode字母中所包含的世界上任何重要语言中
的任何字母。
? 举例,IdentifierTest.java
2012-3-7 Java面向对象程序设计教程 6
Java关键字
abstract default if private this
boolean do implements protected throw
break double import public throws
byte else instanceof return transient
case extends int short try
catch final interface static void
char finally long strictfp volatile
class float native super while
const for new switch
continue goto package synchronized
? const和 goto是保留字
? true,false和 null为相应类型的值,不属于关键字
2012-3-7 Java面向对象程序设计教程 7
强类型语言
( Strongly typed language)
? Java属于强类型的程序设计语言。
? 所有变量和表达式在编译时都有明确的类
型,它有助于编译时的错误检测,
? 类型限制了一个变量能够拥有的或者一个表达
式能够生成的值;
? 类型还限制了各种操作对这些值的支持程度以
及决定操作的含义。
2012-3-7 Java面向对象程序设计教程 8
Java语言的类型结构
Java类型
基本类型 引用类型
数值类型 布尔类型
整 型 浮点型
类 /接口类型 数组类型
byte short int long char
boolean
float
class
double
interface Type[]
(空类型)
(null)
2012-3-7 Java面向对象程序设计教程 9
基本类型
( Primitive Type)
? boolean 用于逻辑运算。
? int,long,byte和 short 用于整数算术运算。
? char 主要用于输入输出。
? double和 float 用于实数(即浮点数)的算术运
算。
? 整型数值缺省为 int型,long型在数值之后加 l或 L
? 浮点型数值缺省为 double型,float型在数值之后
加 f或 F
2012-3-7 Java面向对象程序设计教程 10
基本类型的特点
? 基本类型在所有的平台和实现中的定义相
同,类型名称属于 Java保留的关键字。
? 基本类型的值不允许共享,任何一个基本
类型的变量都会独自拥有一份相同类型的
值。
? 基本类型的变量的值只能通过赋值操作才
能被改变。
2012-3-7 Java面向对象程序设计教程 11
基本类型的值( 1)
类 型 位 数 取值范围
byte 8 bits –128 ~ 127
short 16 bits –32768 ~ 32767
int 32 bits –2147483648 ~ 2147483647
long 64 bits –9223372036854775808 ~ 9223372036854775807
char 16 bits '\u0000' ~ '\uffff'( 0 ~ 65535)
2012-3-7 Java面向对象程序设计教程 12
基本类型的值( 2)
类 型 位 数 取值范围
float 32 bits –3.40282347e+38f ~ –1.40239846e-45f
0.0f
1.40239846e-45f ~ 3.40282347e+38f
double 64 bits –1.79769313486231570e+308 ~
–4.94065645841246544e-324
0.0
4.94065645841246544e-324 ~
1.79769313486231570e+308
2012-3-7 Java面向对象程序设计教程 13
基本类型的值( 3)
类 型 位 数 取值范围
boolean 1 bit true / false
转义字符 Unicode字符 含 义
\ b \u0008 backspace BS(退格)
\ t \u0009 horizontal tab HT( Tab键)
\ n \u000a linefeed LF(换行)
\ f \u000c form feed FF(换页)
\ r \u000d carriage return CR(回车)
\ " \u0022 "( double quote,双引号)
\ ' \u0027 '( single quote,单引号)
\ \ \u005c \( backslash,反斜杠)
2012-3-7 Java面向对象程序设计教程 14
举 例
? 整数值的不同进制表示:
NumeralExpression.java
? 字符的表达方式:
CharacterExpression.java
? 浮点数运算,FloatingTest.java
? 数值类型的取值范围,ValueScope.java
2012-3-7 Java面向对象程序设计教程 15
引用类型
? 类类型( Class type)
? 接口类型( Interface type)
? 数组类型( Array type)
2012-3-7 Java面向对象程序设计教程 16
类类型
? 使用关键字, class‖,它定义了一个新的引用类
型,并描述这一类型的具体实现。
? Java语言定义的根类( Root class)是 Object类,
也就是说除了 Object类以外,其它类都是 Object
类的直接或间接子类( Subclass),这些类只能
扩展(使用关键字, extends‖ )自唯一一个业已
存在的类。
? Object类是缺省的继承父类,如果有一个类直接
继承自 Object类,,extends Object‖可以省略
不写。
2012-3-7 Java面向对象程序设计教程 17
类体的结构组成
? 类的成员
? 类型:类成员(使用关键字 static)和实例成员(无关
键字 static)
? 形式:域( Field;也习惯地叫属性,Attribute)、方
法( Method)、内嵌类( Nested class)和内嵌接
口( Nested interface)
? 实例初始化或者类初始化的语句块( Block)
? 实例对象构造器( Constructor,也称构造方法)
? 举例,ClassExample.java
2012-3-7 Java面向对象程序设计教程 18
接口类型
? 使用关键字, interface‖,定义一套必须由类或组件实现
的操作特征标记。
? 一般有一个或多个操作特征标记以及零个或多个属性集合
的定义。
? 标识接口( Tag interface):不包含任何成员的接口类
型,如 java.io.Serializable,java.lang.Cloneable
? 通过类来实现,使用关键字, implements‖,多个接口类
型之间用,,‖隔开 。类必须包括接口中定义的方法 。
? 接口可以进行多继承,也使用关键字, extends‖ 。
? 接口类型中不存在被其它所有接口类型继承的根接口类型。
2012-3-7 Java面向对象程序设计教程 19
接口体的结构与特点
? 包含与该接口有关的成员,这些成员可以是内嵌
类、内嵌接口、常量或抽象方法。
? 所有接口的成员都被隐式声明为, public‖;
? 所有的内嵌类或接口都被隐式声明为, static‖;
? 所有的成员属性都被隐式声明为, static‖和
,final‖,亦即所有的成员属性都是常量;
? 所有的成员方法都被隐式声明为, abstract‖,亦
即所有的成员方法都不包含任何具体的实现,但
成员方法不能被声明为, static‖,因为静态方法
不能是抽象的。
? 举例,InterfaceExample.java
2012-3-7 Java面向对象程序设计教程 20
数组类型
? 一个数组对象包含一定数量的数组变量,称为数
组的组件或元素。
? 数组元素通过一个非负的整型索引数值被引用。
? 如果数组中包含有 n个元素,则数组元素的索引值
分别为 0~ (n-1)。数组元素的个数可以为零,这
时该数组被称为 empty(空)数组。
? 数组元素的类型可以是基本类型,也可以是其它
的引用类型,一个数组中的所有元素的类型都是
一样的。
2012-3-7 Java面向对象程序设计教程 21
数组表示法
? Java语言中正式使用的表示法是,假如数
组元素的类型表示为 Type,则数组表示
为 Type[] x。如 int[] x,读作 int数组 x。
? 另一种表示法是提供给那些有 C/C++编
程经验的人们使用的,将方括号移到变量
名称的后面,即 Type x[],如 int x[]。
2012-3-7 Java面向对象程序设计教程 22
数组的一些特点
? Java语言中没有直接的多维数组定义,而是把多维数组的
实现理解为数组的数组。
? Java语言中,多维数组中每维数组的长度可以不同,数组
空间也不一定是连续分配的。
? 数组的直接超类是 Object类,因此可以调用 Object类中
的所有方法。
? 每个数组类型都已经实现了 java.io.Serializable和
java.lang.Cloneable接口,也就是可以对数组对象直接
进行串行化处理和对象复制,但对于多维数组也是只能实
现单层复制。
? 数组中元素的个数可通过数组属性 length进行访问。
? 举例,ArrayExample.java
2012-3-7 Java面向对象程序设计教程 23
基本类型的包装类
包装类 对应的
基本类型
字符串转换成数值 数值转换成字符串 包装类中定义的常量
Byte byte b=Byte.parseByte(s)
b=new Byte(s).byteValue()
s=String.valueOf(b) TYPE,MAX_VALUE,
MIN_VALUE
Short short sh=Short.parseShort(s)
sh=new Short(s).shortValue()
s=String.valueOf(sh) TYPE,MAX_VALUE,
MIN_VALUE
Character char s=String.valueOf(c) TYPE,MAX_VALUE,
MIN_VALUE
Integer int n=Interger.parseInt(s)
n=new Integer(s).intValue()
s=String.valueOf(n) TYPE,MAX_VALUE,
MIN_VALUE
Long long g=Long.parseLong(s)
g=new Long(s).longValue()
s=String.valueOf(g) TYPE,MAX_VALUE,
MIN_VALUE
Float float f=Float.parseFloat(s)
f=new Float(s).floatValue()
s=String.valueOf(f) TYPE,MAX_VALUE,
MIN_VALUE,NaN,
NEGATIVE_INFINITY,
POSITIVE_INFINITY
Double double d=Double.parseDouble(s)
d=new Double(s).doubleValue()
s=String.valueOf(d) TYPE,MAX_VALUE,
MIN_VALUE,NaN,
NEGATIVE_INFINITY,
POSITIVE_INFINITY
Boolean boolean b=new Boolean(s).booleanValue() s=String.valueOf(b) TYPE,FALSE,TRUE
2012-3-7 Java面向对象程序设计教程 24
与字符串相关的封装类
? String和 StringBuffer类分别用于处理不变字符串(常量)
和可变字符串。
? Java语言中还提供了一种快速创建 String对象的方式,
非常像基本类型的赋值方式,
String str=‖I am a string constant.‖
? String被设计为存储字符串常量的类,这种实例化形式在
大多数情况下是更好的 String构造技术,这与所创建的字
符串存储在字符串常量池使其可被共享有关。
? 字符串常量池的工作机制是,当需要某一个字符串时,先
到池里查找,如果已经存在,则直接引用;如果还没有就
在池中创建一个新的字符串对象。也可以说,字符串常量
池中内容相同的 String对象只有一个,该对象直到 JVM退
出时才被清除。
? 举例,StringExample.java
2012-3-7 Java面向对象程序设计教程 25
类型转换
? 类型转换方式分为窄化( Narrowing)和
拓宽( Widening)转换。
? 编译时可以自动执行拓宽转换(称为
Promotion,提升)。
? 而窄化转换则总是要求显式执行强制转换
(称为 Cast,转型)。
2012-3-7 Java面向对象程序设计教程 26
基本类型的拓宽转换原则
? 如果存在一个 double型,则按 double型执行运
算。
? 否则,如果存在一个 float型,则按 float型执行
运算。
? 否则,如果存在一个 long型,则按 long型执行
运算。
? 否则,按照 32位的 int型计算精度执行运算。
? 当在整型与浮点型之间进行转换时,计算精度
不仅仅是数据类型的取值范围问题,它还包括
浮点能够存储的十进制数的位数。
? 举例,PrimitiveWidening.java
2012-3-7 Java面向对象程序设计教程 27
基本类型的窄化转换
? 窄化转换意味着余数转换,这种从一个大容量的数据类型
到另一个小容量的数据类型的赋值只会取其较小的数值范
围,这可能造成数量级的损失。
? 如果需要把一个范围较大的整型数值赋给一个范围较小的
数据类型的变量,原则上都需要对数值执行强制转换。
? 对于 byte,short,char类型的变量,在相应类型的取值
范围内时,允许不需要显式强制类型转换而直接赋给 int
型数值,因为这样做并不会引起数据丢失;当所赋数值不
在其取值范围内时,则必须显式进行类型强制转换,否则
将出现错误而不是警告。
? 如果把浮点型数值转换成整型数值,小数点后面的数值将
被圆整去掉。
? 举例,PrimitiveNarrowing.java
2012-3-7 Java面向对象程序设计教程 28
引用类型的转换
? 从子类型转换为父类型即属于引用类型的拓宽转换,特别
是从任何引用类型(包括类、接口、数组)转换成 Java的
根类 Object都属于此种转换形式。引用类型的拓宽转换可
以自动进行,不会引发任何异常。
? 引用类型的窄化转换指的是从父类型转换为子类型,特别
是从 Object类转换成其它任何引用类型都属于这种转换形
式。引用类型的窄化转换同样需要强制进行,即所谓的转
型,这种转换的使用十分广泛,它体现了面向对象的多态
性。
? 转型将在运行时进行类型匹配检查,如果类型不匹配将引
发异常 ClassCastException。
? 举例,ReferenceConversion.java
2012-3-7 Java面向对象程序设计教程 29
类型转换讨论
? 自动转换 ——
不要以为扩大取值范围就万无一失
? 浮点型的有效位问题
? 引用型的属性问题
? 强制转换
3.2 运算符和表达式
2012-3-7 Java面向对象程序设计教程 31
Java语言中的算术运算符与表达式
操作数数目 运算符 表达式 描 述
一元 + +op 正值
- -op 负值
++ ++op,op++ 自增 1
-- --op,op-- 自减 1
二元 + op1+op2 加
- op1-op2 减
* op1*op2 乘
/ op1/op2 除
% op1%op2 取模(求余)
2012-3-7 Java面向对象程序设计教程 32
Java语言中的关系运算符与表达式
运算符 表达式 返回 true的情况
> op1> op2 op1大于 op2
> = op1> =op2 op1大于或等于 op2
< op1< op2 op1小于 op2
< = op1< =op2 op1小于或等于 op2
== op1==op2 op1与 op2相等
!= op1!=op2 op1与 op2不等
2012-3-7 Java面向对象程序设计教程 33
Java语言中的逻辑运算符与表达式
操作数取值 表达式运算结果
op1 op2 op1&&op2 op1||op2 !op1
false false false false true
false true false true true
true false false true false
true true true true false
2012-3-7 Java面向对象程序设计教程 34
Java语言中的位运算符与表达式
运算符 表达式 描 述
& op1 & op2 二元运算,逻辑与,参与运算的两个操作数,如果两个相应位都为 1(或
true),则该位的结果为 1(或 true),否则为 0( false)。
| op1 | op2 二元运算,逻辑或,参与运算的两个操作数,如果两个相应位有一个为 1
(或 true),则该位的结果为 1(或 true),否则为 0( false)。
^ op1 ^ op2 二元运算,逻辑异或,参与运算的两个操作数,如果两个相应位值相反,
则该位的结果为 1(或 true),否则为 0( false)。
~ ~ op1 一元运算,对数据的每个二进制位按位取反。
<< op1 << op2 二元运算,操作数 op1按位左移 op2位,每左移一位,其数值加倍。
>> op1 >> op2 二元运算,操作数 op1按位右移 op2位,每右移一位,其数值减半。
>>> op1 >>> op2 二元运算,操作数 op1按位右移 op2位,正整数运算与 >>同,负整数则求
该数的反码,但符号位不变。
举例,BitOperand.java
2012-3-7 Java面向对象程序设计教程 35
其它运算符
? 条件运算符:三元运算符,其表达式为
someCondition? tureExpression,falseExpression
? 赋值运算符与表达式, =, +=,- =,*=,/=、
%=, <<=,>>=,>>>=,&=,|=,^=
? instanceof运算符
2012-3-7 Java面向对象程序设计教程 36
Java语言运算符优先级以及
同等优先级运算符的组合顺序
运算符 描 述 优先级(数越大优先
级越高)
同等优先级结
合顺序
( ) 圆括号 15 左 → 右
new 创建类实例 15 左 → 右
[ ] 数组下标运算符 15 左 → 右
,成员(属性、方法)选择 15 左 → 右
++,-- 后缀自增(自减) 1 14 右 → 左
++,-- 前缀自增(自减) 1 13 右 → 左
~ 按位取反 13 右 → 左
! 逻辑非 13 右 → 左
-,+ 算术负(正)号 13 右 → 左
(Type) 强制类型转换 13 右 → 左
*,/,% 乘、除、取模运算 12 左 → 右
+,- 加、减运算 11 左 → 右
<<,>>,>>> 左右移位运算 10 左 → 右
2012-3-7 Java面向对象程序设计教程 37
Java语言运算符优先级以及
同等优先级运算符的组合顺序(续)
运算符 描 述 优先级(数越大优
先级越高)
同等优先级结合顺

instanceof,
<,<=,>,>=
关系运算 9 左 → 右
==,!= 相等性运算 8 左 → 右
& 位逻辑与 7 左 → 右
^ 位逻辑异或 6 左 → 右
| 位逻辑或 5 左 → 右
&& 条件与 4 左 → 右
|| 条件或 3 左 → 右
, 条件运算符 2 右 → 左
=,*=,/=,%=,
+=,-=,<<=,>>=,
>>>=,&=,^=,|=
赋值运算符 1 右 → 左
举例,EvaluationOrder.java
2012-3-7 Java面向对象程序设计教程 38
关于断句
无鸡鸭亦可无鱼肉亦可青菜一小碟足矣
2012-3-7 Java面向对象程序设计教程 39
整型支持的操作运算
? 比较运算,其结果为 boolean型,
? 大小比较 <,<=,>,>=
? 相等比较 ==,!=
? 数值运算,其结果为 int或 long型,
? 加减运算 +,-
? 乘除运算 *,/,%
? 符号运算 +,-
? 前(后)缀自增运算 ++
? 前(后)缀自减运算 --
? 位运算 <<,>>,>>>
? 按位取反运算 ~
? 按位逻辑运算 &,|,^
? 条件运算?,
? 类型转换运算 (Type)
? 字符串连接运算 +
? Byte,Short,Integer,Long,Character等包装类中的方法
? Java中存在一个称为的 java.math.BigInteger类,支持无限制的整数运算。
2012-3-7 Java面向对象程序设计教程 40
浮点型支持的操作运算
? 比较运算,其结果为 boolean型,
? 大小比较 <,<=,>,>=
? 相等比较 ==,!=
? 数值运算,其结果为 float或 double型,
? 加减运算 +, -
? 乘除运算 *,/,%
? 符号运算 +,-
? 前(后)缀自增运算 ++
? 前(后)缀自减运算 --
? 条件运算?,
? 类型转换运算 (Type)
? 字符串连接运算 +
? Float,Double等包装类中的方法以及 java.lang.Math类,Math类中
包含许多与数学运算有关的方法,如幂运算方法 exp(double a)、随机
数生成方法 random()、正弦函数计算方法 sin(double a),等等。
? Java语言存在一个称为 java.math.BigDecimal的类,支持无限制的实
数运算。
2012-3-7 Java面向对象程序设计教程 41
布尔型支持的操作运算
? 关系比较运算 ==,!=
? 逻辑非运算 !
? 逻辑运算 &,|,^
? 条件与和条件或 &&,||
? 条件运算?,
? 字符串连接运算 +,布尔型的值 true和 false都可
以转换成字符串,并作字符串连接运算。
? Boolean包装类中的方法。
3.3 语句
2012-3-7 Java面向对象程序设计教程 43
编组语句
? 代码块由一对花括号, {}‖界定,中间包含
零或多个语句以及局部变量声明组成,且
能够以任何顺序存在。
无论任何位置,只要允许单个语句存在,
都可以放置代码块。
? 空语句仅仅是分号, ;, 本身。
空语句不执行任何动作,无论何处,只要
可以放置普通语句,都可以使用空语句。
空语句总是可以完全正常执行。
2012-3-7 Java面向对象程序设计教程 44
表达式语句
? 赋值、方法调用、类的实例化、自增(减)
1运算等,都是表达式语句。
? 常用的语句格式如下,
? new StringBuffer(―Hello‖); //创建不被引用
的实例对象
? new JFrame().setVisible(true); //方法调

? i++; //自增运算
? a=b; //赋值
2012-3-7 Java面向对象程序设计教程 45
选择语句
? if语句的一般语法格式如下,
if(boolean-expression)
statement1;
[else
statement2;]
? switch语句的一般语法格式如下,
switch (expression){
case value1, statement1;
break;
case value2, statement2;
break;

case valueN, statemendN;
break;
[default, defaultStatement; ]
}
? 举例,Kid.java
2012-3-7 Java面向对象程序设计教程 46
循环语句
? while语句
[initialization] //初始化部分
while (termination){ //布尔型表达式,循环终止条件
body; //循环体部分
[iteration;] //迭代部分
}
? do-while语句
[initialization] //初始化部分
do {
body; //循环体部分
[iteration;] //迭代部分
} while (termination); //布尔型表达式,循环终止条件
? for语句
for (initialization; termination; iteration){ //初始化部分;循环终止条件;迭代部分
body; //循环体部分
}
? 无限循环语句
while(true){… }
for( ; ; ){… }
2012-3-7 Java面向对象程序设计教程 47
讨论:迭代与递归
? 迭代( Iteration)法通常采用循环语句
(如 for语句,while语句,do-while语句
等)来完成运算,递归( Recursion)法通
常采用选择语句(如 if语句,if-else语句、
switch语句等)来完成运算。
? 本质上迭代和递归都包含着循环:迭代法
是显式调用了循环语句,而递归法则通过
自我调用的策略来实现循环。
? 举例,Fibonacci.java
2012-3-7 Java面向对象程序设计教程 48
控制转移语句
? 标识语句
? continue语句
? break语句
? return语句
2012-3-7 Java面向对象程序设计教程 49
注释语句
? 单行注释以, //‖开始,直至行末端结束。
? 多行注释也可以采用以, /*‖开始、以, */‖
结束的方式来定义。
? 以, /**‖开始的注释形式,表明此后的正
文内容可以由自动文档生成器 javadoc读取。
? 举例,Control.java