第2章 Java语言基础
2.1 Java
符号集
2.2
数据类型、常量与变量
2.3
表达式和语句
第2章 Java语言基础
2.1 Java
符号集
符号是构成语言和程序的基本单位。Java语言不采用通常计
算机语言系统所采用的ASCII代码集,而是采用更为国际化的
Unicode字符集。在这种字符集中,每个字符用二个字节即16位
表示。这样,整个字符集中共包含65 535个字符。其中,前面
256个字符表示ASCII码,使Java对ASCII码具有兼容性;后面21
000个字符用来表示汉字等非拉丁字符。但是,Unicode只用在
Java平台内部,当涉及打印、屏幕显示、键盘输入等外部操作
时,仍由计算机的具体操作系统决定其表示方法。例如,使用
英文操作系统时,仍采用8位二进制表示的ASCII码。Java编译器
接收到用户程序代码后,将它们转换成各种基本符号元素。
第2章 Java语言基础
Java符号按词法可分为如下5类:
(1) 标识符(Identifiers)。它唯一地标识计算机中运行或存在
的任何一个成分的名称。不过,通常所说的标识符是指用户自
定义标识符,即用户为自己程序中的各种成分所定义的名称。
(2) 关键字(Keyword)。关键字也称为保留字,是Java系统本
身已经使用且被赋予特定意义的一些标识符。
(3) 运算符(Operands)。表示各种运算的符号,它与运算数一
起组成运算式,以完成计算任务。如表示算术运算的+、-、*、/
等算术运算符以及其他一些运算符号。
第2章 Java语言基础
(4) 分隔符(Separator)。在程序中起分隔作用的符号,如空
格、逗号等。
(5) 常量(Literals)。这里主要是指标识符常量。为了使用方
便和统一,Java系统对一些常用的量赋予了特定的名称,这种
用一个特定名称标记的常量便称为标识符常量。例如,用
Integer.MAX_VALUE代表最大整数2 147 483 647(请参阅表2.7和
表2.8)。用户也可以把自己程序中某些常用的量用标识符定义为
标识符常量。
第2章 Java语言基础
2.1.1
标识符及其命名
在计算机中运行或存在的任何一个成分(变量、常量、标签、
方法和类等),都需要有一个名字以标识它的存在和唯一性,这
个名字就是标识符。用户必须为自己程序中的每一个成分取一
个唯一的名字(标识符)。在Java语言中对标识符的定义有如下规
定:
(1) 标识符的长度不限。但在实际命名时不宜过长,过长会
增加录入的工作量。
(2) 标识符可以由字母、数字、下划线“_”和美元符号“$”组
成,但必须以字母、下划线或美元符号开头。
第2章 Java语言基础
(3) 标识符中同一个字母的大写或小写被认为是不同的标识符,
即标识符区分字母的大小写。例如:C1_1和c1_1代表不同的标识符。
(4)变量名不能是关键字、布尔型字符(ture或者false)或保留
字。
通常情况下,为提高程序的可读性和可理解性,在对程序中
的任何一个成分命名时,应该取一个能反映该对象含义的名称作为
标识符。此外,作为一种习惯,标识符的开头或标识符中出现的每
个单词的首字母通常大写,其余字母小写。例如,TestPoint,
getArea。
第2章 Java语言基础
2.1.2
关键字
关键字通常也称为保留字,是程序设计语言本身已经使用
且被赋予特定意义的一些标识符。它们主要是类型标识符(如
int,float,char,class等)或控制语句中的关键字(如if,while)等。
表2.1列出了Java语言的关键字。需要特别注意的是:由于程序
设计语言的编译器在对程序进行编译的过程中,对关键字作特
殊对待,所以,编程人员不能用关键字作为自己定义程序成分
的标识符。
第2章 Java语言基础
表2.1 Java
的关键字表
abstract
cast
default
final
goto*
int
operator
rest
synchronized
try
boolean
catch
do
finally
if
interface
outer
return
this
var
break
char
double
float
implements
long
package
short
throw
void
第2章 Java语言基础
byte
class
else
for
import
native
private
static
throws
volatile
byvalue *
const*
extends
future
inner
new
protected
super
transient
while
case
continue
false
generic
instanceof
null
public
switch
true
表2.1 Java
的关键字表
第2章 Java语言基础
2.1.3
运算符
运算符与运算数一起组成运算式,以完成计算任务。Java的
运算符列于表2.2中。
表2.2 Java
运算符
+/
&< >>
.
+=
/=
&=
<=
||
instan
ceof
-|
%!
==
[ ]
-+
|= %=
!=
=
*^
> ++
~
*=
^=
>=
--
?:
第2章 Java语言基础
2.1.4
分隔符
分隔符使程序代码组织成编译器所理解的形式,它构造了
语句的结构和程序的结构。Java中的分隔符如表2.3所示。
表2.3 Java
的分隔符
( ) {} [ ] ; , 空格符
第2章 Java语言基础
2.1.5
注释
注释是程序中的说明性文字,是程序的非执行部分。在程序
中加注释的目的是为了使程序更加易读易理解,有助于修改程序
以及他人阅读。程序(软件)的易读性和易理解性是软件质量评价
的重要指标之一,程序中的注释对于学术交流和软件维护具有重
要的作用。Java语言中使用如下三种方式给程序加注释:
(1) //注释内容。表示从“//”开头直到此行末尾均作为注释。
例如:
//comment line
第2章 Java语言基础
(2) /*注释内容*/。表示从“/*”开头,直到“*/”结束均作为注
释,可占多行。例如:
/* comment on one
or more line */
(3) /**注释内容*/。表示从“/**”开头,直到“*/”结束均作为
注释,可占多行。例如:
/** documenting comment
having many line */
第2章 Java语言基础
在编程时,如果只注释一行,则选择第一种;若注释内容
较多,一行写不完时,既可选择第一种方式,在每行注释前加
“//”,也可选择第二种方式,在注释段首尾分别加“/*”和“*/”;第
三种方式主要用于创建web页面的HTML文件,Java的文档生成
器能从这类注释中提取信息,并将其规范化后用于建立web页。
第2章 Java语言基础
2.2
数据类型常量与变量
任何一种程序设计语言,都要使用和处理数据,而数据又
可以区分为不同的类型。例如,我们在中学时已经将数值区分
为自然数、小数、有理数、虚数等。用计算机进行数据处理
时,同样要将数据区分为不同的类型,通过指明变量所属的数
据类型,将相关的操作封装在数据类型中。
熟练地掌握常量、变量、数据类型等基本概念,可为程序
设计奠定坚实的基础。
第2章 Java语言基础
2.2.1
数据类型的概念
数据以某种特定的格式存放在计算机的存储器中,不同的数
据占用存储单元的多少不同,而且,不同的数据其操作方式也
不尽相同。在计算机中,将数据的这两方面的性质抽象为数据
类型的概念。因此,数据类型在程序中就具有两个方面的作用:
一是确定了该类型数据的取值范围,这实际上是由给定数据类
型所占存储单元的多少而决定的;二是确定了允许对这些数据
所进行的操作。例如,整数类型和浮点类型都可以进行加、减、
乘、除四则运算,而字符型和布尔型就不能进行这类运算。同
样,整数类型可以进行求余运算而浮点类型就不能进行这种运
算。
第2章 Java语言基础
表2.4 Java
数据类型及其在定义时使用的关键字
名 称使用的关键字
占用字节数
数
据
类
型
基
本
类
整数类型
字节型byte 1
短整型short 2
整型int 4
长整型long 8
浮点类型
浮点型float 4
双精度型double 8
第2章 Java语言基础
表2.4 Java
数据类型及其在定义时使用的关键字
字符类型char 2
布尔类型boolean 1
字符串string
数组
类class
接口interface
复
合
类
型
第2章 Java语言基础
2.2.2
常量
常量是指在程序的整个运行过程中其值始终保持不变的量。
在Java系统中,常量有两种形式:一种是以字面形式直接给出值
的常量;另一种则是以关键字final定义的标识符常量。不论哪种
形式的常量,它们一经建立,在程序的整个运行过程中其值始
终不会改变。按照由浅入深的学习规律,这里我们只讨论以字
面形式直接给出值的常量,至于以关键字final定义的标识符常
量,将在第4章讨论final修饰符时专门论述。
Java中常用的常量,按其数据类型来分,有整数型常量、浮
点型常量、布尔型常量、字符型常量和字符串常量等5种。下面
将逐一介绍它们。
第2章 Java语言基础
1.
整数型常量
整数型常量有3种表示形式:
(1) 十进制整数。如:56,-24,0。
(2) 八进制整数。以零开头的数是八进制整数。如:017,
0,0123。
(3) 十六进制整数。以0x开头的数是十六进制整数。如:
0x17,ox0,0xf,0xD。十六进制整数可以包含数字0~9、字母
a~f或A~F。
整数型常量在机内使用4个字节存储,适合表示的数值范围
是-2 147 483 648~2 147 483 647。若要使用更大的数值,则应在
数据末尾加上大写的L或小写的l(即长整型数据),这样可使整数
型常量在机内使用8个字节存储。
第2章 Java语言基础
2.
浮点型常量
浮点型常量又称实型常量,用于表示有小数部分的十进制
数,它有两种表示形式:
(1) 小数点形式。它由数字和小数点组成。如:3.9,-0.23,-
23.,.23,0.23。
(2) 指数形式。如:2.3e3,2.3E3,都表示2.3×103;.2e-4表示
0.2×10-4。
浮点型常量在机内的存储方式又分两种:单精度与双精度。
在浮点型常量后不加任何字符或加上d或D表示双精度,如:
2.3e3,2.3e3d,2.3e3D,2.4,2.4d,2.4D。在机内用8个字节存放
双精度浮点型常量。在浮点型常量后加上f或F,表示单精度。如:
2.3e3F, 2.4f,2.4F。在机内用4个字节存放单精度浮点型常量。
第2章 Java语言基础
3.
布尔型常量
布尔型常量只有两个:true和false。它代表一个逻辑量的两
种不同的状态值,用true表示真,而用false表示假。
4.
字符型常量
字符型常量有4种形式:
(1) 用单引号括起的单个字符。这个字符可以是Unicode字符
集中的任何字符。例如:'b','F','4','*'。
注意 在程序中用到引号的地方(不论单引号或双引号),应
使用英文半角的引号,不要写成中文全角的引号。初学者往往容
易忽视这一问题,造成编译时的语法错误。
第2章 Java语言基础
(2) 用单引号括起的转义字符。ASCII字符集中的前32个字
符是控制字符,具有特殊的含义,如回车、换行等,这些字符
很难用一般方式表示。为了清楚地表示这些特殊字符,Java中引
人了一些特别的定义:用反斜线“\”开头,后面跟一个字母来表
示某个特定的控制符,这便是转义字符。Java中的转义字符如表
2.5所示。
第2章 Java语言基础
表2.5 Java
的转义字符
引用方法对应Unicode码标准表示法意 义
'/b'
'/t'
'/n'
'/f'
'/r'
'/"'
'/''
'//'
'/u0008'
'/u0009'
'/u000a'
'/u000c'
'/u000d'
'/u0022'
'/u0027'
'/u005c'
BS
HT
LF
FF
CR
"
0'
/
退格
水平制表符tab
换行
表格符
回车
双引号
单引号
反斜线
第2章 Java语言基础
(3) 用单引号括起的八进制转义序列,形式为:'/ddd'。此处
ddd表示八进制数中的数字符号0~7。如:'/101'。
八进制表示法只能表示 '/000'~'/377' 范围内的字符,即表
示ASCII字符集部分,不能表示全部的Unicode字符。
(4) 用单引号括起的Unicode转义字符,形式为:'/uxxxx'。
此处xxxx表示十六进制数。如:'/u3a4f '。
第2章 Java语言基础
5.
字符串常量
字符串常量是用双引号括起的0个或多个字符串序列。字符
串中可以包括转义字符。
如:"Hello","two\nline","/22/u3f07/n A B 1234/n"," "。
在Java中要求一个字符串在一行内写完。若需要一个大于一
行的字符串,则可以使用连接操作符“+”把两个或更多的字符串
常量串接在一起组成一个长串。
例如,"How do you do?"+"/n"的结果是"How do you
do?"。
第2章 Java语言基础
2.2.3
变量
变量是在程序的运行过程中其值可以被改变的量。变量除了
区分为不同的数据类型外,更重要的是每个变量都具有变量名和
变量值两重含义。变量名是用户自已定义的标识符。这个标识符
代表计算机存储器中存储一个数据的位置的名字,它代表着计算
机中的一个或一系列存储单元。变量名一旦定义便不会改变。变
量的值则是这个变量在某一时刻的取值,它是变量名所表示的存
储单元中存放的数据,它是随着程序的运行而不断变化的。变量
名与变量值的关系,恰似宾馆的房间号与这个房间中住的客人的
关系一样,房间号不变而客人随时都有可能改变。变量之所以称
为变量,是因为在这个固定的名字下的取值可以随时发生变化。
第2章 Java语言基础
Java中的变量遵从先声明后使用的原则。声明的作用有两点:
一是确定该变量的标识符(即名称),以便系统为它指定存储地址
和识别它,这便是“按名访问”原则;二是为该变量指定数据类
型,以便系统为它分配足够的存储单元。因此,声明变量包括给
出变量的名称和指明变量的数据类型,必要时还可以指定变量的
初始值。变量的声明是通过声明语句来实现的,变量的声明格式
如下: 类型名 变量名1[,变量名2][,……];
或: 类型名 变量名1[=初值1][,变量名2[=初值2],……];
其中方括号括起来的部分是可选的。
第2章 Java语言基础
变量经声明以后,便可以对其赋值和使用。变量经声明之
后,若在使用前没有赋值,则在编译时会指出语法错误。例
如,下面均是一些合法的变量声明语句:
char ch1, ch2; //char是类型名,ch1,ch2是变量名(标识符)。
int i, j, k=9; //int为类型名,i、j、k为变量名,并且k的初值
为9。
float x1=0, x2, y1=0, y2; // float是类型名,x1、x2、y1、y2
是变量名。
第2章 Java语言基础
1.
整数类型
整数类型用来表示整数。Java中的整数类型,按其取值范围
之不同,可区分为如表2.6所示的四种。
表2.6
整
数
类
型
类型存储需求取值范围
byte 1字节-128~127
short 2字节-32 768~32 767
int 4字节-2 147 483 648~2 147 483 647
long 8字节-9 223 372 036 854 775 808~9 223 372 036 854 775 807
第2章 Java语言基础
整型变量的定义方法是在自己定义的变量名(标识符)前面加
上Java系统关键字byte、short、int、long中的某一个,则这个标
识符所代表的变量就属于该关键字类型的整型变量,它的存储需
求和取值范围就限定在表2.6所示的范围内。此外,Java允许在定
义变量标识符的同时给变量赋初值(初始化)。例如:
int i, j, k=9; //声明标识符分别为i、j、k的变量为整型变量,
并且k的初值为9。
此外,在Java程序中,int型和long型的最小值和最大值可用
符号常量表示,如表2.7所示。
第2章 Java语言基础
表2.7
整数类型的最小值和最大值的符号常量表示
符号常量名含义十进制值
Integer.MIN_VALUE
Integer.MAX_VALUE
Long.MIN_VALUE
Long.MAX_VALUE
最小整数
最大整数
最小长整数
最大长整数
-2 147 483 648
2 147 483 647
-9 223 372 036 854 775 808
9 223 372 036 854 775 807
第2章 Java语言基础
【程序示例c2_1.java】
public class c2_1
{ public static void main(String args[ ])
{ byte a1=071; //八进制数
byte a2=10; //十进制数
byte a3=0x21; //十六进制数
int b1,b2,i1=4;
short c1=0x1E2;
long d=0x10EF,d1=1234567;
b1=b2=15;
第2章 Java语言基础
System.out.print("sum="+(1+5));
System.out.print("/ta1="+a1);
System.out.print("/ta2="+a2);
System.out.println("/ta3="+a3);
System.out.print("/tb1="+b1);
System.out.print("/tb2="+b2);
System.out.println("/tc1="+c1);
System.out.print("/td="+d);
System.out.print("/ti1="+i1);
System.out.println("/td1="+d1);
}
}
第2章 Java语言基础
运行结果如下:
sum=6 a1=57 a2=10 a3=33
b1=15 b2=15 c1=482
d=4335 i1=4 d1=1234567
第2章 Java语言基础
2.
浮点类型
浮点类型用来表示小数。Java中的浮点类型按其取值范围之
不同,可区分为float型(浮点型)和double型(双精度型)两种,如表
2.8所示。
表2.8
浮
点
类
型
类型存储需求取 值 范 围
float 4字节-3.402 823 47E+38F ~ 3.402 823 47E+38F
(7位有效数据)
double 8字节
-1.797 693 134 862 315 7E+308
~ 1.797 693 134 862 315 7E+308
(15位有效数据)
第2章 Java语言基础
浮点类型变量的定义方法与整型变量的定义方法类似,只
不过是在自己定义的变量名(标识符)前面加上Java系统关键字
float、double中的某一个。例如:
double b;
float a1=3.4f,a2=3.4f ,a3;
第一行声明标识符b为双精度(double)型变量,第二行声明标
识符分别为a1、a2、a3的变量为浮点(float)型变量,并且a1,a2的
初值为3.4。
应注意两点:第一,不能写成:float a1=a2=3.4f;第二,常
量值后的f不可省略。
Java还提供了代表float型和double型最小值和最大值的符号
常量,见表2.9。
第2章 Java语言基础
表2.9
浮点类型特定值的符号常量表示
符 号含 义
Float.MIN_VALUE 1.4e-45
Float.MAX_VALUE 3.402 823 47E+37
Float.NEGATIVE_INFINITY 小于-3.402 823 47E+38
Float.POSITIVE_INFINITY 大于Float.MAX_VALUE的数
Double.MIN_VALUE 5e-324
Double.MAX_VALUE 1.797 693 134 862 315 7E+308
Double.NEGATIVE_INFINITY 小于-1.797 693 134 862 315 7E+308的数
Double.POSITIVE_INFINITY 大于Double.MAX_VALUE的数
NaN 无意义的运算结果
第2章 Java语言基础
【程序示例c2_2.java】
public class c2_2
{
public static void main(String [ ] args)
{
float x,y,z;
x=94.3f;
y=32.9f;
z=x/y;
System.out.println(x+"/"+y+"="+z);
}
} 程序的运行结果是:
94.3/32.9=2.8662612
第2章 Java语言基础
3.
字符类型
Java提供的字符类型,如表2.10所示。
表2.10
字
符
类
型
字符类型变量的定义方法是在变量标识符前加上系统关键
字“char”。例如:
char c1,c2='A';
声明标识符分别为c1、c2的变量为字符型变量,并且c2的
初值为字符A。
类 型存储需求范 围
char 2字节Unicode字符集
第2章 Java语言基础
【程序示例c2_3.java】
public class c2_3
{ public static void main(String args[ ])
{ char c1, c2, c3; //声明变量c1、c2、c3为字符型变量
c1='H'; //在以c1标识的存储单元中存入字符H
c2='//'; //在以c2标识的存储单元中存入字符/
c3='/115'; //在c3中存入八进制115代表的ASCII字符M
System.out.print(c1); //输出字符型变量c1的值
System.out.print(c2); //输出字符型变量c2的值
System.out.print(c3); //输出字符型变量c3的值
}
}
该程序的运行结果是: H/M
第2章 Java语言基础
4.
布尔类型
Java提供的布尔类型,如表2.11所示。
表2.11
布
尔
类
型
类 型取值范围
boolean true 或 false
第2章 Java语言基础
布尔类型变量的定义方法是在变量标识符前加上系统关键
字
boolean。例如:
boolean f1=true, f2;
声明变量f1、f2为布尔型变量,并且我们为f1取初值为
true,f2没有给出初值,系统为它取默认值false。
第2章 Java语言基础
【示例程序c2_4.java】
public class c2_4
{
public static void main(String args[ ])
{
boolean x, y, z; //声明变量x、y、z为布尔型变量
int a=89, b=20;
x=(a>b); //对布尔型变量赋值(这里涉及的关系运算请参阅表2.15)
y=(a!=b); //对布尔型变量赋值
z=(a+b==43); //对布尔型变量赋值
System.out.println("x="+x); //输出布尔型变量的值
System.out.println("y="+y); //输出布尔型变量的值
System.out.println("z="+z); //输出布尔型变量的值
}
}
第2章 Java语言基础
运行结果如下:
x=true
y=true
z=false
第2章 Java语言基础
2.3
表达式和语句
表达式是用运算符把操作数(变量、常量及方法等)连接起来
表达某种运算或含义的式子。表达式通常用于简单的计算或描
述一个操作条件。系统在处理表达式后将根据处理结果返回一
个值,该值的类型称为表达式的类型。表达式的类型由操作数
和运算符的语义确定。Java语言的运算符很丰富,因此,表达式
的种类也很多。根据表达式中所使用的运算符和运算结果的不
同,可以将表达式分为:算术表达式、关系表达式、逻辑表达
式、赋值表达式、条件表达式等类。本节将逐一介绍各类表达
式。
第2章 Java语言基础
2.3.1
算术表达式
算术表达式是由算术运算符和位运算符与操作数连接组成
的表达式。表达式的类型由运算符和操作数确定。算术表达式
的运算与我们在中、小学学过的知识基本相同。
1.
算术运算符
算术运算符根据所需要操作数的个数,可分为双目运算符和
单目运算符,见表2.12所示。
双目运算符需要两个操作数,这两个操作数分别写在运算符
的左右两边。单目运算符只需要一个操作数,可以位于运算符
的任意一侧,但是分别有不同的含义。
第2章 Java语言基础
需要注意的是:
(1) 两个整数类型的数据做除法时,结果只保留整数部分。
如:2/3的结果为0。
(2) 只有整数类型才能进行取余运算,其结果是两数整除
后的余数。例如:9%2的结果为1。
第2章 Java语言基础
表2.12 算 术 运 算 符
运算符运算举例等效的运算
双目
运算
符
+ 加法a+b
- 减法a-b
* 乘法a*b
/ 除法a/b
% 取余数a%b
单目
运算
符
++ 自增1 a++或 ++a a=a+1
– – 自减1 a– –或– – a a=a–1
– 取反– a a=– a
第2章 Java语言基础
(3) 自增与自减运算符只适用于变量,且变量可以位于运算
符的任意一侧,但各有不同的效果。例如,下面的三个语句清楚
地说明了这一点。
int a1=2,a2=2;
int b=(++a1)*2; //先加1后使用
int c=(a2++)*2; //先使用后加1
尽管a1和a2的原值都为2,但执行后b的值是6,而c的值是4,这
是因为++a1表示在使用变量a1之前,先使a1的值加1,然后再使
用其新值;而a2++表示先使用a2的原值,待使用完之后,再使a2
的值加1。当然,这三个语句执行完后,a1和a2的值都为3。
第2章 Java语言基础
2.
算术运算符的优先级
所谓运算符的优先级是指当一个表达式中出现不同的算术运
算符时,执行运算的优先次序。
表2.13
算术运算符优先级
第2章 Java语言基础
图2.1 算术运算符的优先次序示例
第2章 Java语言基础
在书写表达式时,应该注意以下几点:
(1) 写表达式时,若运算符的优先级记不清,可使用括号改
变优先级的次序。
(2) 过长的表达式可分为几个表达式来写。
(3) 在一个表达式中最好不要连续使用两个运算符,例如:
a+++b。这种写法往往使读者弄不清到底是a+(++b),还是
(a++)+b。如果一定要表达这种含义,则最好用括号进行分组或
者用空隔符分隔。例如:a+ ++b。
第2章 Java语言基础
【示例程序c2_5.java】
public class c2_5
{
public static void main(String args[ ])
{
int x,y,z,a,b;
a=9;
b=2;
x=a%b;
y=2+ ++a;
z=7+ --b;
System.out.print("/tx="+x);
System.out.print("/ty="+y);
System.out.println("/tz="+z);
}
}
运行结果是:
x=1 y=12 z=8
第2章 Java语言基础
3.
强制类型转换
强制类型转换是指在一个表达式中出现的各种变量或常量
的数据类型不同时,所进行的数据类型转换(casting conversion)。
Java程序中的类型转换可分为显式类型转换和隐式类型转换两种
形式。
第2章 Java语言基础
(1) 隐式类型转换。对于由双目运算中的算术运算符组成的表
达式,一般要求运算符两边的两个操作数的类型一致,如果两者
的类型不一致,则系统会自动转换为较高(即取值范围较大)的类
型,这便是隐式数据类型转换。根据操作数的类型,隐式转换的
规则如下:
(byte或short)与int型运算,转换为int型;
(byte或short或int)与long型运算,转换为long型;
(byte或short或int或long)与float型运算,转换为float型;
(byte或short或int或long或float)与double型运算,转换为double
型;
char型与int型运算,转换为int型。
第2章 Java语言基础
例如:
int i;
short j=3;
float a=5.0f;
则:i+j+a的值为float型。
第2章 Java语言基础
(2) 显式类型转换。隐式类型转换只能由较低类型向较高类
型转换,但是在实际工作中,有时也可能需要由较高类型向较低
类型转换。例如,我们在计算数值时为了保证其精度,为某些变
量取了较高的数据类型(如double型),但在输出时,往往只需要
保留两、三位小数或者只输出整数,这时只能进行显式类型转换。
显式类型转换需要人为地在表达式前面指明所需要转换的类型,
系统将按这一要求把某种类型强制性地转换为指定的类型,其一
般形式如下:
(<类型名>)<表达式>
第2章 Java语言基础
例如:
int i ;
float h=9.6F;
i=(int)h;
则i的值为9。
需要注意的是:使用显式转换会导致精度下降或数据溢出,
因此要谨慎使用。此外,显式类型转换是暂时的。
第2章 Java语言基础
例如:
int i=98,m;
float h;
h=3.4F+(float)i;
m=2+i;
在h=3.4F+(float)i表达式中,通过显示类型转换将整型变量i
的类型转换为float型,而在其后的表达式m=2+i中,i仍为int型。
可见,显示类型转换是暂时的。
第2章 Java语言基础
2.3.2
赋值表达式
由赋值运算符组成的表达式称为赋值表达式。
1.
赋值运算符
Java语言中,赋值运算符是“=”。赋值运算符的作用是将赋
值运算符右边的数据或表达式的值赋给赋值运算符左边的变量。
注意赋值号左边必须是变量。
例如:
double s=6.5+45; //将表达式6.5+45的和值赋给变量s
第2章 Java语言基础
2.
赋值中的类型转换
在赋值表达式中,如果运算符两侧的数据类型不一致,但
赋值符左边变量的数据类型较高时,系统会自动进行隐式类型
转换,当然也可以人为地进行显式类型转换;如果赋值符左边
变量的数据类型低于右边表达式值的类型,则必须进行显式类
型转换,否则编译时会报错。例如:
第2章 Java语言基础
【示例程序c2_6.java】
public class c2_6
{ public static void main(String args[ ])
{
int x,y;
x=(int)82.5;
y='A'+'b';
int a=65602; //00010042H
float b;
char c1, c2='A';
b=a; //正确的隐式类型转换,运算时先将a的值转换为b的
类型,再赋给b
第2章 Java语言基础
b=c2; //正确的隐式类型转换
//c1=a; //不正确的隐式类型转换,编译器会报错
c1=(char) a; //正确的显式类型转换,运算时Java将a的值按
char类型的宽度削窄 (抛弃高位的两个字节)再赋给c2,使c2的值
为字符'B'。
System.out.print("/tx="+x);
System.out.print("/ty="+y);
System.out.print("/ta="+a);
System.out.print("/tb="+b);
System.out.print("/tc1="+c1);
System.out.println("/tc2="+c2);
}
}
该程序的运行结果是:
x=82 y=163 a=65602 b=65.0 c1=B c2=A
第2章 Java语言基础
3
.复合赋值运算符
在赋值运算符“=”之前加上其他运算符,则构成复合赋值运
算符。Java的复合赋值运算符见表2.14。
表2.14 Java
的复合赋值运算符
复合赋值
运算符
举例等效于
复合赋值
运算符
举例等效于
+=
x+=y
x=x+y
-+
x-=y
x=x-y
*
=
x
*
=y
x=x
*
y
/=
x/=y
x=x/y
%=
x%=y
x=x%y
^=
x^=y
x=x^y
&=
x&=y
x=x&y
|=
x|=y
x=x|y
<<=
x<<=y
x=x<<y
>>=
x>>=y
x=x>>y
>>>=
x>>>=y
x=x>>>y
第2章 Java语言基础
【示例程序c2_7.java】
public class c2_7
{
public static void main(String args[ ])
{ int x,y,z;
x=1;
y=2; z=3;
x+=y;
y%=x;
z/=x;
System.out.print("/tx="+(x+=y));
System.out.print("/ty="+y);
System.out.println("/tz="+z);
}
}
运行结果是:
x=5 y=2 z=1
第2章 Java语言基础
2.3.3
表达式语句
前已述及,在程序中通过语句向计算机系统发出相应的操
作指令,而最基本的语句便是表达式语句。在Java程序中,只要
在一个表达式的末尾加上一个分号“;”就构成了表达式语句。最
典型的例子是在一个赋值表达式的末尾加上一个分号以构成赋
值语句。例如:
x=8
是一个赋值表达式,而
x=8;
是一个赋值语句。
第2章 Java语言基础
可见,分号是Java语句中不可缺少的一部分,一个语句必
须在末尾带一个分号。在学习本节的同时,请同学们务必区分
表达式和表达式语句两个紧密联系,又有区别的概念。简单地
说,表达式是一个数学上的概念,而表达式语句是程序设计中
的概念。
第2章 Java语言基础
2.3.4
关系表达式
利用关系运算符连接的式子称为关系表达式。关系运算实
际上就是我们常说的比较运算,它有6个运算符号,列于表2.15
中。关系运算容易理解,但需注意两点:①关系表达式的运算
结果是一个逻辑值“真”或“假”,在Java中用true表示“真”,用
false表示“假”。②注意区分等于运算符“==”和赋值运算符“=”。
第2章 Java语言基础
表2.15 Java
的关系运算符
运算符含义
示例(设x=6,y=8)
运算结果
== 等于x==y flase
!= 不等于x!=y true
> 大于x>y flase
< 小于x<y true
>= 大于等于x>=y flase
<= 小于等于x<=y true
第2章 Java语言基础
【示例程序c2_8.java】
public class c2_8
{
public static void main(String args[ ])
{
boolean x,y;
double a,b;
a=12.897;
b=345.6;
x=(a!=b);
y=(a==b);
System.out.println("(a>b)="+(a>b));
System.out.println("x="+x);
System.out.println("y="+y);
}
}
运行结果如下:
(a>b)=false
x=true
y=false
第2章 Java语言基础
2.3.5
逻辑表达式
利用逻辑运算符将操作数连接的式子称为逻辑表达式,逻辑
表达式的运算结果是布尔型值。逻辑运算符如表2.16所示。
表2.16 Java
的逻辑运算符
运算符运算举例运 算 规 则
& 与x&y x,y都为true时,结果为true
| 或x|y x,y都为false时,结果为false
! 非!x x为true时,结果为false;x为false时,结果为true
^ 异或x^y x,y都为true或都为false时,结果为false
&& 条件与x&&y x,y都为true时,结果为true
|| 条件或x||y x,y都为false时,结果为false
第2章 Java语言基础
注意:“&”和“|”在执行操作时,运算符左右两边的表达式
首先被运算执行,再对两表达式的结果进行与、或运算。而利
用“&&”和“||”执行操作时,如果从左边的表达式中得到的操作
数能确定运算结果,就不再对右边的表达式进行运算。采用
“&&”和“||”的目的是为了加快运算速度。
第2章 Java语言基础
【示例程序c2_9.java】
public class c2_9
{
public static void main(String args[ ])
{
boolean x,y,z,a,b;
a='b'>'N';
b='A'!='A';
x=(!a);
y=(a&&b);
z=(a^b);
System.out.print("/ta="+a);
System.out.print ("/tb="+b);
System.out.print("/tx="+x);
System.out.print("/ty="+y);
System.out.println("/tz="+z);
}
}
运行结果如下:
a=true b=false x=false y=false z=true
第2章 Java语言基础
2.3.6
位运算
表2.17 Java
语言的位运算符
运算符运算举例
~ 位反~x
& 位与x&y
| 位或x|y
^ 位异或x^y
<< 左移x<<n
>> 右移x>>n
>>> 不带符号的右移x>>>n
第2章 Java语言基础
表2.17 Java
语言的位运算符
运算规则(设x=11010110,y=01011001,n=2) 运算结果
将x按比特位取反00101001
x,y按位进行与操作01010000
x,y按位进行或操作11011111
x,y按位进行异或操作10001111
x各比特位左移n位,右边补0 01011000
x各比特位右移n位,左边按符号位补0或1 11110101
x各比特位右移n位,左边的空位一律填零00110101
第2章 Java语言基础
【示例程序c2_10.java】
public class c2_10
{
public static void main(String args[ ])
{
int x,y,z,a,b;
a=22; //a=00010110
b=3; //b=00000011
x=a>>>b; //a的内容右移3位,左边补0。x=00000010=2
y=a^b; //y=00010101=21
z=~a; //z=11101001=-23
System.out.print("/ta&b="+(a&b));
System.out.print("/ta|b="+(a|b));
System.out.println("/ta<<b="+(a<<b));
System.out.print("/ta>>b="+(a>>b));
System.out.print("/tx="+x);
System.out.print("/ty="+y);
System.out.println("/tz="+z);
}
}
运行结果如下:
a&b=2 a|b=23 a<<b=176
a>>b=2 x=2 y=21 z=-23
第2章 Java语言基础
2.3.7
运算符的优先级
运算符的优先级决定了表达式中不同运算执行的先后次
序,优先级高的先进行运算,优先级低的后进行运算。在优先
级相同的情况下,由结合性决定运算的顺序。表2.18中列出了
Java运算符的优先级与结合性。
最基本的规律是:域和分组运算优先级最高,接下来依次
是单目运算、双目运算、三目运算,赋值运算的优先级最低。
第2章 Java语言基础
表2.18 Java
运算符的优先级与结合性
运 算 符描 述优先级结合性
. [ ] ( ) 域运算,数组下标,分
组括号1 最高自左至右
++ -- - ! ~ 单目运算2
单目
右/左
new (type) 分配空间,强制类型转
换3 自右至左
第2章 Java语言基础
* / % 算术乘、除、求余运算4
双目
自左至右
(左结合性
)
+ - 算术加减运算5
<< >> >>> 位运算6
< <= > >= 小于,小于等于,大于,大于等于7
== != 相等,不等8
& 按位与9
^ 按位异或10
| 按位或11
&& 逻辑与12
|| 逻辑或13
?: 条件运算符14 三目自右至左
(右结合性
= *= /= %= += -= <<= )
>>= >>>= &= ^= |= 赋值运算15 赋值最
低