第2章Java的基本数据类型运算符及表达式Word下载.docx
《第2章Java的基本数据类型运算符及表达式Word下载.docx》由会员分享,可在线阅读,更多相关《第2章Java的基本数据类型运算符及表达式Word下载.docx(20页珍藏版)》请在冰豆网上搜索。
short
static
super
try
true
this
throw
throws
void
threadsafe
transient
while
synchronized
2.2数据类型
Java语言的数据类型可划分为基本数据类型和引用数据类型(如图2-1所示)。
本章我们主要介绍基本数据类型,引用型数据类型将在后边的章节中介绍,数组和字符串本身属于类,由于它们比较特殊且常用,因此也在图2-1中列出。
基本数据类型如表2.2所示。
下边我们将简要介绍这些数据类型。
表2.2Java的基本数据类型
数据类型
所占二进制位
所占字节
取值
8
1
-27~27-1
16
2
-215~215-1
32
4
-231~231-1
64
-263~263-1
任意字符
true,false
-3.4E38(3.4×
1038)~3.4E38(3.4×
1038)
-1.7E308(1.7×
10308)~1.7E308(1.7×
10308)
2.2.1常量和变量
常量和变量是程序的重要元素。
1.常量
所谓常量就是在程序运行过程中保持不变的量即不能被程序改变的量,也把它称为最终量。
常量可分为标识常量和直接常量(字面常量):
1)标识常量
标识常量使用一个标识符来替代一个常数值,其定义的一般格式为:
final数据类型常量名=value[,常量名=value…];
其中
final是保留字,说明后边定义的是常量即最终量;
数据类型是常量的数据类型,它可以是基本数据类型之一;
常量名是标识符,它表示常数值value,在程序中凡是用到value值的地方均可用常量名标识符替代。
finaldoublePI=3.1415926;
//定义了标识常量PI,其值为3.1415926
在程序中,为了区分常量标识符和变量标识符,常量标识符一般全部使用大写书写。
2)直接常量(字面常量)
直接常量就是直接出现在程序语句中的常量值,例如上边的3.1415926。
直接常量也有数据类型,系统根据字面量识别,例如:
21,45,789,1254,-254表示整型量;
12L,123l,-145321L尾部加大写字母L或小写字母l表示该量是长整型量;
456.12,-2546,987.235表示双精度浮点型量;
4567.2145F,54678.2f尾部加大写字母F或小写字母f表示单精度浮点型量。
2.变量
变量是程序中的基本存储单元,在程序的运行过程中可以随时改变其存储单元的值。
1)变量的定义
变量的一般定义如下:
数据类型变量名[=value][,变量名[=value]…];
其中:
数据类型表示后边定义变量的数据类型;
变量名变量名,是一个标识符,应遵循标识符的命名规则。
可以在说明变量的同时为变量赋初值。
intn1=456,n2=687;
floatf1=3654.4f,f2=1.325f
doubled1=2145.2;
2)变量的作用域
变量的作用域是指变量自定义的地方起,可以使用的有效范围。
在程序中不同的地方定义的变量具有不同的作用域。
一般情况下,在本程序块(即以大括号“{}”括起的程序段)内定义的变量在本程序块内有效。
例2.1说明变量作用域的示例程序。
/**这是说明变量作用域的示例程序
*程序的名字为Var_Area_Example.java
*/
publicclassVar_Area_Example
{
staticintn_var1=10;
//类变量,对整个类都有效
publicvoiddisplay()
intn_var2=200;
//方法变量,只在该方法内有效
n_var1=n_var1+n_var2;
System.out.println("
n_var1="
+n_var1);
System.out.println("
n_var2="
+n_var2);
}
publicstaticvoidmain(Stringargs[])
intn_var3;
n_var3=n_var1*2;
n_var3="
+n_var3);
2.2.2基本数据类型
1.整型
Java提供了四种整型数据,如上表2-2所示。
1)整型常量的表示方法
整型常量可以十进制、八进制和十六进制表示。
一般情况下使用十进制表示,如:
123,-456,0,23456。
在特定情况下,根据需要可以使用八进制或十六进制形式表示整常量。
以八进制表示时,以0开头,如:
0123表示十进制数83,-011表示十进制数-9。
以十六进制表示整常量时,以0x或0X开头,如:
0x123表示十进制数291,-0X12表示十进制数-18。
此外长整型常量的表示方法是在数值的尾部加一个拖尾的字符L或l,如:
456l,0123L,0x25l。
2)整型变量的定义
intx=123;
//指定变量x为int型,且赋初值为123
byteb=8;
//指定变量b为byte型,且赋初值为8
shorts=10;
//指定变量s为short型,且赋初值为10
longy=123L,z=123l;
//指定变量y,z为long型,且分别赋初值为123
2.字符型(char)
字符型(char)数据占据两个字节16个二进制位。
字符常量是用单引号括起来的一个字符,如‘a’,‘A’等。
字符型变量的定义,如:
charc=’a’;
//指定变量c为char型,且赋初值为'
a'
3.布尔型(boolean)
布尔型数据的值只有两个:
true和false。
因此布尔的常量值也只能取这两个值。
布尔型变量的定义,如:
booleanb1=true,b2=false;
//定义布尔变量b1,b2并分别赋予真值和假值。
4.浮点型(实型)
Java提供了两种浮点型数据,单精度和双精度,如表2-2所示。
1)实型常量的表示方法
一般情况下实型常量以如下形式表示:
0.123,1.23,123.0等等表示双精度数;
123.4f,145.67F,0.65431f等等表示单精度数。
当表示的数字比较大或比较小时,采用科学计数法的形式表示,如:
1.23e13或123E11均表示123×
1011;
0.1e-8或1E-9均表示10-9。
我们把e或E之前的常数称之为尾数部分,e或E后面的常数称之为指数部分。
使用科学计数法表示常数时,指数和尾数部分均不能省略,且指数部分必须为整数。
2)实型变量的定义
在定义变量时,都可以赋予它一个初值,例如:
floatx=123.5f,y=1.23e8f;
//定义单精度变量x,y并分别赋予123.5、1.23×
108的值
doubled1=456.78,d2=1.8e50;
//定义双精度变量d1,d2并分别赋予456.78、1.8×
1050的值。
2.2.3基本数据类型的封装
以上介绍的Java的基本数据类型不属于类,在实际应用中,除了需要进行运算之外,有时还需要将数值转换为数字字符串或者将数字字符串转换为数值等等。
在面向对象的程序设计语言中,类似这样的处理是由类、对象的方法完成的。
在Java中,对每种基本的数据类型都提供了其对应的封装类(称为封装器类wrapperclass)。
如下表2.3所示。
表2.3基本数据类型和对应的封装类
对应的类
Boolean
Integer
Byte
Long
Character
Float
Short
Double
应该注意的是,尽管由基本类型声明的变量或由其对应类建立的类对象,它们都可以保存同一个值,但在使用上不能互换,因为它们是两个完全不同的概念,一个是基本变量,一个是类的对象实例。
我们将在后边的章节中讨论它们。
2.3Java运算符和表达式
运算符和表达式是构成程序语句的要素,必须切实掌握灵活运用。
Java提供了多种运算符,分别用于不同运算处理。
表达式是由操作数(变量或常量)和运算符按一定的语法形式组成的符号序列。
一个常量或一个变量名是最简单的表达式。
表达式是可以计算值的运算式,一个表达式有确定类型的值。
2.3.1算术运算符和算术表达式
算术运算符用于数值量的算术运算,它们是:
+(加),-(减),*(乘),/(除),%(求余数),++(自加1),--(自减1)。
按照Java语法,我们把由算术运算符连接数值型操作数的运算式称之为算术表达式。
x+y*z/2、i++、(a+b)%10等等。
加、减、乘、除四则运算大家已经很熟悉了,下边看一下其他运算符的运算:
%求两数相除后的余数,如:
5/3余数为2;
5.5/3余数为2.5。
++、--是一元运算符,参与运算的是单变量,其功能是自身加1或减1。
它分为前置运算和后置运算,如:
++i,i++,--i,i--等等。
下边举一个例子说明算术运算符及表达式的使用。
例2.2使用算术运算符及表达式的示例程序。
classArithmetic
{
publicstaticvoidmain(String[]arg)
inta=0,b=1;
floatx=5f,y=10f;
floats0,s1;
s0=x*a++;
//5*0=0
s1=++b*y;
//2*10=20
System.out.println("
a="
+a+"
b="
+b+"
s0="
+s0+"
s1="
+s1);
s0=a+b;
//1+2=3
s1++;
//20+1=21
x%s0="
+x%s0+"
s1%y="
+s1%y);
}
图2-2示例2.2运行结果
}
程序运行结果如下:
2.3.2关系运算符和关系表达式
关系运算符用于两个量的比较运算,它们是:
>
(大于),<
(小于),>
=(大于等于),<
=(小于等于),==(等于),!
=(不等于)。
关系运算符组成的关系表达式(或称比较表达式)产生一个布尔值。
若关系表达式成立产生一个true值,否则产生一个false值。
当x=90,y=78时,
x>
y产生true值;
x==y产生false值。
2.3.3布尔逻辑运算符和布尔表达式
布尔逻辑运算符用于布尔量的运算,有3个布尔逻辑运算符:
1.!
(逻辑非)
!
是一元运算符,用于单个逻辑或关系表达式的运算。
运算的一般形式是:
!
A
A是布尔逻辑或关系表达式。
若A的值为true,则!
A的值false,否则为true。
若x=90,y=80,则表达式:
!
(x>
y)的值为false(由于x>
y产生true值)。
(x==y)的值为true(由于x==y产生false值)。
2.&
&
(逻辑与)
用于两个布尔逻辑或关系表达式的与运算。
A&
B
A、B是布尔逻辑或关系表达式。
若A和B的值均为true,则A&
B的值为true,否则为false。
若x=50,y=60,z=70,则表达式:
(x>
y)&
(y>
z)的值为false(由于两个表达式x>
y、y>
z的关系均不成立)。
(y>
x)&
(z>
y)的值为true(由于两个表达式y>
x、z>
y的关系均成立)。
z)的值为false(由于表达式y>
z的关系不成立)。
3.||(逻辑或)
||用于两个布尔逻辑或关系表达式的运算。
||运算的一般形式是:
A||B
若A和B的值只要有一个为true,则A||B的值为true;
若A和B的值均为false时,A||B的值为false。
y)||y>
z)的值为false(由于两个表达式x>
x)||(z>
x)||(y>
z)的值为true(由于表达式y>
x的关系成立)。
下边举一个例子看一下布尔逻辑运算符及表达式的使用。
例2.3布尔逻辑运算符及表达式的示例。
classLogicExam2_3
publicstaticvoidmain(String[]arg)
inta=0,b=1;
floatx=5f,y=10f;
booleanl1,l2,l3,l4,l5;
l1=(a==b)||(x>
y);
//l1=false
l2=(x<
y)&
(b!
=a);
//l2=true
l3=l1&
l2;
//l3=false
l4=l1||l2||l3;
//l4=true
l5=!
l4;
//l5=false
l1="
+l1+"
l2="
+l2+"
l3="
+l3+"
l4="
+l4+"
l5="
+l5);
图2-3示例2.3运行结果
程序的执行结果如下:
2.3.4位运算符及表达式
位运算符主要用于整数的二进制位运算。
可以把它们分为移位运算和按位运算。
1.移位运算
1)位右移运算(>
>
)
用于整数的二进制位右移运算,在移位操作的过程中,符号位不变,其他位右移。
例如,将整数a进行右移2位的操作:
a>
2)位左移运算(<
<
用于整数的二进制位左移运算,在移位操作的过程中,左边的位移出(舍弃),右边位补0。
例如,将整数a进行左移3位的操作:
a<
3
3)不带符号右移运算(>
用于整数的二进制位右移运算,在移位操作的过程中,右边位移出,左边位补0。
例如,将整数a进行不带符号右移2位的操作:
2.按位运算
1)&
(按位与)
运算符用于两个整数的二进制按位与运算,在按位与操作过程中,如果对应两位的值均为1,则该位的运算结果为1,否则为0。
例如,将整数a和b进行按位与操作:
a&
b
2)|(按位或)
|运算符用于两个整数的二进制按位或运算,在按位或操作过程中,如果对应两位的值只要有一个为1,则该位的运算结果为1,否则为0。
例如,将整数a和b进行按位或操作:
a|b
3)^(按位异或)
^运算符用于两个整数的二进制按位异或运算,在按位异或操作过程中,如果对应两位的值相异(即一个为1,另一个为0),则该位的运算结果为1,否则为0。
例如,将整数a和b进行按位异或操作:
a^b
4)~(按位取反)
~是一元运算符,用于单个整数的二进制按位取反操作(即将二进制位的1变为0,0变为1)。
例如,将整数a进行按位取反操作:
~a
下边举一个例子简要说明位运算的使用。
例2.4整数二进制位运算的示例。
为了以二进制形式显示,程序中使用Integer类的方法toBinaryString()将整数值转换为二进制形式的字符串,程序代码如下:
classBitExam2_4
publicstaticvoidmain(String[]arg)
inti1=-128,i2=127;
i1="
+Integer.toBinaryString(i1));
i1>
2="
+Integer.toBinaryString(i1>
2));
2="
i2="
+Integer.toBinaryString(i2));
i2>
+Integer.toBinaryString(i2>
i1&
i2="
+Integer.toBinaryString(i1&
i2));
i1^i2="
+Integer.toBinaryString(i1^i2));
i1|i2="
+Integer.toBinaryString(i1|i2));
~i1="
+Integer.toBinaryString(~i1));
图2-4位运算示例结果
程序运行结果如图2-4所示。
结果是以二进制形式显示的,如果是负值,32位二进制位数全显示;
如果是正值,前导0忽略,只显示有效位。
2.3.5赋值运算符(=)和赋值表达式
赋值运算符是最常用的运算符,用于把一个表达式的值赋给一个变量(或对象)。
在前边的示例中,我们已经看到了赋值运算符的应用。
与c、c++类似,Java也提供了复合的或称扩展的赋值运算符:
对算术运算有:
+=,-=,*=,/=,%=。
对位运算有:
&
=,^=,|=,<
=,>
=。
x*=x+y;
相当于x=x*(x+y);
x+=y;
相当于x=x+y;
y&
=z;
相当于y=y&
z;
y>
=2;
相当于y=y>
2;
2.3.6条件运算符(?
:
)及表达式
条件运算符是三元运算符,有条件运算符组成的条件表达式的一般使用格式是:
逻辑(关系)表达式?
表达式1:
表达式2
其功能是:
若逻辑(关系)表达式的值为true,取表达式1的值,否则取表达式2的值。
条件运算符及条件表达式常用于简单分支的取值处理。
例如,若已定义a,b为整型变量且以赋值,求a,b两个数中的最大者,并赋给另一个量max,可以用如下式子处理:
max=(a>
b)?
a:
b;
2.3.7对象运算符
对象运算符如下:
1.构造对象(new)
new运算符主要用于构建类的对象,我们将在后边的章节作详细介绍。
2.分量运算符(.)
.运算符主要用于获取类、对象的属性和方法。
例如上边程序中使用System类对象的输出方法在屏幕上输出信息:
System.out.println(“myfirstJavaprogram”);
3.对象测试(instanceof)
instanceof运算符主要用于对象的测试。
将在后边应用时介绍它。
2.3.8其它运算符
还有如下一些运算符:
1.数组下标运算符([])
主要用于数组。
2.强制类型转换运算符((类型))
在高类型的数据向低类型的数据转换时,一般需要强制转换。
3.()运算符
()运算符用在运算表达式中,它改变运算的优先次序;
用于对象方法调用时作为方法的调用运算符。
4.字符串连接符(+)
在表达式中,如果+号运算符前边的操作数是一个字符串,此时该+号运算符的作用是字符串连接符,例如:
”i1*i2=”+i1*i2
在程序中的System.out.print()输出方法的参数中,我们常常使用这种形式的表达式。
2.3.9表达式的运算规则
最简单的表达式是一个常量或一个变量,当表达式中含有两个或两以上的运算符时,就称为复杂表达式。
在组成一个复杂的表达式时,要注意以下两点:
1.Java运算符的优先级
表达式中运算的先后顺序由运算符的优先级确定,掌握运算的优先次序是非常重要的,它确定了表达式的表达是否符合题意,表达式的值是否正确。
表2.4列出了Java中所有运算符的优先级顺序。
表2.4Java运算符的优先次序
.,[],()
9
一元运算:
+,-,++,--,!
~
10
^
new,(类型)
11
|
*,/,%
12
5
+,-
13
||
6
>
<
14
?
:
7
=,<
=,instanceof
15
=,+=,-=,*=,/=,%=,^=
==,!
=
=,|=,<
=,>
=
当然,我们不必刻意去死记硬背这些优先次序,使用多了,自然也就熟悉了。
在书写表达式时,如果不太熟悉某些优先次序,可使用()运算符改变优先次序。
2.类型转换
整型、实型、字符型数据可以混合运算。
运算中,不同类型的数据先转化为同一类型,然后进行运算,一般情况下,系统自动将两个运算数中低级的运算数转