Java面向对象思想与程序设计
上QQ阅读APP看书,第一时间看更新

2.1 数据类型和运算符号

2.1.1 Java数据类型

整型数

Java语言本身定义的数据类型称为基本数据类型。在基本数据类型的基础上,还可以定义其他数据类型,称为自定义类型,如后面讲到的类、接口和枚举等。在实际进行程序设计时,多数情况下,都要根据问题自定义数据类型。

基本数据类型是自定义数据类型的基础,所以读者在学习时应该先掌握好基本数据类型。

Java中的基本数据类型有字节型(byte)、短整型(short)、基本整型(int)、长整型(long)、单精度型(float)、双精度型(double)、布尔型或逻辑型(boolean)和字符型(char)。

基本数据类型可以分为4个类型,即整型数、实型数(浮点数)、布尔型数和字符型数,可以用图2-1表示基本数据类型的组成。

图2-1 基本数据类型分类

1. 整型数

没有小数部分的数值型数就是整型数,如123、-456等,而123.0、-456.78则不是整型数。

(1)字节型。用一个字节(8个二进制数)表示整型数,所以一个字节型数表示数的范围是-128~127。使用字节型数,在有些情况下可以节省内存空间。

(2)短整型。用两个字节(16个二进制数)表示整型数,一个短整型数表示数的范围是-32768~32767。

(3)基本整型。用4个字节(32个二进制数)表示整型数,一个基本整型数表示数的范围是-231~231-1。

(4)长整型。用8个字节(64个二进制数)表示长整型数,一个长整型数表示数的范围是-263~263-1 。

给定一个整型数,它的默认类型是基本整型,如123、-456都是基本整型数。如果想使一个整数表示的是长整型数,则可以在整型数后加L或l,如123L、-456l是长整型数而不是基本整型数(小写l容易与1混淆,所以最好不要用小写l)。

没有单独表示字节型数和短整型数的方法。在定义变量时(请参照变量定义),如果给变量赋的值不超过相应类型的范围,则该数就是相应的类型。如:

 

byte b=123; //字节型变量b的初值是123

short s=12345; //短整型变量s的初值是12345

整型数还可以用八进制、十六进制和二进制的形式表示。

用八进制表示时,使用数字0~7,并且数据以0开头。如:0123、0447都是八进制数,而0789则是非法数据。

用十六进制表示时,使用数字0~9和字母A~F(或a~f)表示,并且以0x(或0X)开头。如:0x123、0x45fa、0x97AE等都是十六进制数。

用二进制表示时,只使用数字0和1,并且以0b(或0B)开头。如:0b1101、0B010011都是二进制数,而0b123则是非法数据。

在进行科学计算时,一般不使用八进制、十六进制或二进制的形式表示整型数,而是使用十进制数的形式表示整型数。在写计算机系统程序时,使用八进制、十六进制和二进制表示数据时较为方便。

2.浮点数

浮点数、布尔型数

带有小数点的数值数就是浮点数。如:123.、123.0、123.45都是浮点数。

浮点数所表示的数据是有误差的。浮点数根据其所表示数的精度可以将浮点数分为单精度数和双精度数。

一个浮点数默认为是双精度度数,如123.0是一个双精度数。如果想明确地说明一个数是双精度数,可以在数据的后面加D或d,如:123.0d、-456.78D都是双精度数。

如果在一个浮点数后面加F或f,明确地表示该数是一个单精度数。如:123.0f、-456.78F是单精度数而不是双精度数。

浮点数可以用指数形式表示。如:123.45e3、-1.25E-5F、12.456e1 D使用指数形式表示浮点数时,e或E的前面必须有数字,其后面必须是一个整型数。如:12.3e、12.3e2.5、e-3等不是合法的指数形式的浮点数。

3.布尔型数

字符型数

布尔型数是逻辑值,用于表示“真”和“假”。

布尔型数的值用true和false表示。true表示“真”,false表示“假”。

4.字符型数

用单引号引起的单个字符就是字符型数。如:'a' 'X' 'd' '2' '8' '中' '国'等都是字符型数。

在Java中,任何一个字符型数都是Unicode字符集中的字符。Unicode是计算机科学领域中的字符编码标准,在这个字符集中为每种语言中的每个字符设定了统一并且唯一的二进制编码,以满足跨语言、跨平台进行文本转换、处理的要求。

由于用两个字节的编码表示字符,所以字符集中最多可以有65535个字符。字符"(空字符,或0,或' \u0000' ——十六进制表示的转义字符)在表中有最小值,而字符' \uffff '在表中有最大值(65535)。

在编写程序时,有些特殊字符无法在程序中输入,这时可以用转义字符来表示。转义字符是字符'/'和个别字符组合而形成的字符,组合之后的字符表示的是其他字符。转义字符及含义如表2-1所列。

表2-1 转义字符及含义

续表

如:

字符'a'用转义字符表示可以写成'\141'或'\u0061'

字符'2'用转义字符表示可以写成'\62'或'\u0032'(字符'2'的Unicode编码为50)

表面上看,字符是非数值型数据,但是字符在内存中存储时存放的是字符的Unicode编码,而Unicode编码是一个整型数,所以有些情况下可以把字符型数当作整型数。例如,将数值8转换成字符'8',可以进行下面的运算:

(char)(8+'0')

“8+'0'”运算时先获得字符'0'的Unicode编码(整型数),再和8相加,得到'8'的Unicode编码(整型数),再将这个编码强制转换成字符型数,最后得到字符'8'。

5.字符串型数

当需要表示一个人的姓名、专业、班级和通信地址等信息时,必须使用文字来表示。在Java程序中,用文字表示的信息也是数据(非数值型数据),这样的数据在程序中以字符串的形式表示。字符串是用双引号引起的若干字符序列,如:"Math""This is a Java program.""China""123""Beijing"等都是字符串。字符串中可以包含转义字符。

字符串不是基本类型的数据,但是通常情况下都被当作是基本数据类型的数据使用。具体表示字符串时是用String类的对象来表示。

【例2.1】转义字符及字符串的使用。

【代码】

 

publicclass Example2_01

{

  publicstaticvoid main(String args[])

  {

  //注意下面两条语句的不同

    System.out.println("He said:\"I'm learning Java.\"");

    System.out.print("He said:\"I\'m learning Java.\"\n");

    int a=123,b=456;//下面用3个退格转义字符将789删除

    System.out.println(a+"+"+b+"=789"+"\b\b\b"+(a+b));

    System.out.println();//只输出一个换行

    //利用制表符控制间距

    System.out.println("\t学号\t姓名\t年龄\t专业\t通讯地址");

    System.out.println("\n\t0001\t张三\t18 \t计算机\t学府路1号");

    System.out.println("\t0002\t李四\t19 \t计算机\t学府路1号");

    }

}

程序运行结果如图2-2所示。

图2-2 例2.1的运行结果

6.数据分隔符

数据分隔符

如果数据比较大或数据的位数比较多,则该数的可读性差,这时可以用“_”对数据进行分隔以增加数据的可读性。如:

 

long credit Card Number = 1234_5678_9012_3456L;

long social Security Number = 999_99_9999L;

float pi = 3.14_15F;

long hex Bytes = 0x FF_EC_DE_5E;

long hex Words = 0x CAFE_BABE;

long max Long = 0x7fff_ffff_ffff_ffff L;

byte nybbles = 0b0010_0101;

long bytes = 0b11010010_01101001_10010100_10010010;

int x3 = 5_______2;//多个连续的分隔符

分隔符“_”只能用于数字之间,只要有需要就可以使用。但下列情况不可以使用分隔符:

(1)数据的开始和结束处不许使用分隔符

(2)浮点数的小数点旁不允许使用分隔符

(3)在数据的前缀或后缀( 如F或 L)之前或之后不许使用分隔符

(4)字符串中使用“_”当作普通字符

如:

 

float pi1 = 3_.1415F;

float pi2 = 3._1415F;

long social Security Number1 = 999_99_9999_L;

int x2 = 52_;

int x4 = 0_x52;

int x5 = 0x_52;

int x7 = 0x52_;

等都是对“_”的不正确使用。

7.基本数据类型数据的优先次序

一般地,字节数多的数有较高的精度,字节数少的数的精度较低。所以,基本数据类型中数值型数据按精度从低到高的次序为:

byte→short→char→int→long→float→double

当不同类型的数据进行混合运算时,低精度数先转换成高精度数再与高精度数进行运算,最后得到的数据的类型是高精度类型。

8.数据在内存中的存放形式

这里只介绍整型数在内存中的存放形式。数据在内存中是以二进制的补码形式存放的。

0和正数的补码与其本身的二进制数相同,负数的补码需要进行转换才能得到。转换过程如下。

(1)将负数取绝对值,并转换成二进制数。如一个字节型数-12:

0   0   0   0   1   1   0   0

(2)将二进制数的各位取反:

1   1   1   1   0   0   1   1

(3)低位(最右侧的位)再加1:

1   1   1   1   0   1   0   0

所以-12的补码是1111_0100。

再将字节型数-128转换成补码:

1  0  0  0  0  0  0  0 取绝对值并转换成二进制数

0   1   1   1   1   1   1   1 按位取反

1   0   0   0   0   0   0   0 再加1

所以-128的补码是1000_0000。

如果一个数的高位(最左侧的位)是1,则表示该数是负数,如-12和-128,而13和127的高位都是0。

在数据进行运算时,直接用数据的补码进行计算。例如-10+15的运算:

再执行-10-(15)计算:

25加上负号后等于-25。

2.1.2 标识符与关键字

1.标识符

在程序中用于标识变量、类、对象和接口等元素的名字称为标识符。如:

 

int i;

class Student{//…}

i是一个标识符,它表示一个整型变量;Student也是一个标识符,它表示一个类的类名。

2.关键字

关键字也是标识符,但是关键字是由Java语言定义的,程序员不可以再重新定义为用户的标识符。如上面的int、class都是关键字,不能把它们再重新定义。

一般地,标识符指的是用户自定义的名字,关键字是Java语言定义的名字。

3.变量

标识符、关键字、变量

变量是用户自定义的标识符,用于保存数据。

变量在使用前必须先定义。变量定义的形式:

数据类型变量列表;

如:

 

int a,b;

int i,j;

double d;

float f;

上面的前两条语句可以用一条语句实现:

int a,b,i,j;

一般来说,性质类似或相同的变量可以用同一条语句定义。

变量在参与运算前必须有确定的值,可以通过赋值运算(“=”)把确定的数据赋给变量。如上面定义的变量:

 

a=123;

d=-457.89;

则变量a和d可以参加相应的运算。如果不对变量赋值,则编译时会出现编译错误,如上面

定义的变量:

f=2*b;

变量b还没有确定的值,所以编译不能通过。

变量在定义时可以给变量赋初值,称为变量初始化。变量初始化的语法形式:

数据类型 变量1=初始1,变量2=初值2,……,变量n=初值n;

如:

int a=10,b=-35;

变量的类型决定了它所保留的值的类型。如:

d=123;

d是一个双精度型的变量,123是一个整型数。赋值后再访问变量d只能得到123.0,得不到整型数123。

赋值时不能将一个高精度的数据赋给一个低精度的变量。如果这样赋值,编译时同样不能通过。如:

a=123.45;

123.45是一个双精度数,变量a是一个整型变量,赋值后会造成数据的丢失。为了保证程序的健壮性,Java不允许这样赋值。

把一个低精度的数据赋给一个高精度的变量是可以的。

4.数据类型转换

数据类型转换

不同类型的数据是不能运算的。但是在实际的数据处理中,通常是不同类型的数据混合运算(尤其在科学计算中)。为了能够实现不同类型数据的运算,在运算前先将数据转换成同一类型后再进行运算。

数据类型转换的基本原则是将低精度的数据转换成高精度的数据(可以避免数据的丢失)。数据类型转换又可以分为自动类型转换和强制类型转换。

(1)自动类型转换

Java编译器能根据参与运算的数据的数据类型自动地将一些数据转换为其他类型。如上面的赋值语句“d=123;”,d是一个双精度数,编译器会自动将整型数123转换成双精度数123.0,然后赋给变量d。再如下面的运算:

123+'a'+2*150.0

计算“123+'a'”时,自动将字符'a'转换成int型数97,再与123相加得到int型数220;计算“2*150.0”时,2是int型数,150.0是double型数,所以先将2转换成double型的数2.0,再与150.0相乘得到double型数300.0。最后的运算是“220+300.0”,先将220转换成双精度数220.0,再与300.0相加,最后得到一个双精度数。

(2)强制类型转换

上面的语句:

a=123.45;

编译不能通过。如果将该语句改成:

a=(int)123.45;

则编译能够通过并将123赋给变量a。其中的运算“(int)123.45”是一个强制类型转换表达式,它是将双精度数123.45强制转换成整型数123。

强制类型转换的语法形式:

(数据类型)(表达式)

(数据类型)表达式

其作用是将“表达式”的值转换成“数据类型”所说明的类型。

例如,表达式“1/3”,它的结果是0(整型数除以整型数的结果仍然是整型数)。如果想得到结果0.33,则可以写成下面的表达式:

(float)1/3

1/(float)3

在第1个表达式中,“(float)1”是将1强制转换成单精度数1.0,然后再被整型数3除。1.0和3是不同类型的数据,所以先将1.0和3都自动转换为双精度数后再进行运算。

注意,“(float)1/3”与“float(1/3)”不同。

2.1.3 运算符

运算符用于执行数据的运算。Java中的运算符如表2-2所列。

表2-2 运算符

运算符有两个性质,分别是优先级和结合性。

当进行混合运算时,必须根据运算符的优先级进行运算。如“a+b*c”,乘法“*”的优先级比加法“+”的优先级高,所以先计算“b*c”,然后再与“a”做加法运算。

结合性指的是相同优先级的运算符进行运算时,是从左侧开始计算还是从右侧开始计算。如果从左侧开始计算称为左结合,否则称为右结合。

根据运算符的运算对象(操作数)的个数可以将运算符分为一元运算符、二元运算符和三元运算符。Java中多数运算符都是二元运算符,少数是一元运算符,三元运算符只有一个“?:”。

1.算术运算符

算术运算符

算术运算符执行算术运算,Java中共有9个算术运算符,其中包含5个二元运算符,4个一元运算符。

(1)二元算术运算符

二元算术运算符分别是+(加)、-(减)、*(乘)、/(除)和%(取余),其中的+、-、*、/的操作数可以是任何数值型数据。

做除法运算时,整型数和整型数相除,结果是整型数,如1/3=0、5/2=2。

取余运算时,两个操作数必须是整型数,其结果是两个数相除后的余数,如1%3=1, 5%2=1,2%3=2。求余数可按a%b=a-a/b*b计算,如:

 

System.out.println(11%2); //结果为1

System.out.println(11%-2); //结果为1

System.out.println(-11%2); //结果为-1

System.out.println(-11%-2); //结果为-1

从结果看,结果的符号取决于第1个操作数,所以当两个整数做取余运算时,可以先计算两数绝对值的余数,再根据第1个操作数的符号确定结果的符号。

二元算术运算符中,*、/和%有相同的优先级,结合性是从左往右。+和-有相同的优先级,但是比前3个优先级低,结合性也是从左往右。

注意,在程序中写算术表达式时,不能将数学中的算术式直接写在程序中,而应按Java的语法写表达式。如:

在Java中应写成:

(-b+Math.sqrt(b*b-4*a*c))/(2*a)

其中的Math是Java的数学类,sqrt是Math类中的方法,用这个方法可以计算一个数的平方根。

(2)一元算术运算符

一元算术运算符分别是+(取正)、-(取负)、++(变量值增加1)和--(变量值减1)。其中+和-的操作数可以是任何数值型数据。语法形式:

+(表达式)

-(表达式)

表示将“表达式”的值取正或取负。取正(+)运算较少用。

++和--运算符可以使变量增加1或减少1,它们的操作数一定是变量,不能是表达式。多数情况下变量都是整型变量,浮点型变量较少用这样的运算。

根据运算符和操作数的位置不同可以分为前缀运算和后缀运算。运算符在操作数前称前缀运算,在后则称为后缀运算。语法形式如下(以++为例):

++变量

变量++

前缀和后缀的运算结果都可以使变量增加或减少1,但运算过程不同。

如果是前缀运算,先使变量增加1,然后再用这个变量参与其他运算;如果是后缀运算,则先使用这个变量,使用变量后再使变量增加或减少1。如下面的两组运算:

inti=10,j;     inti=10,j;

j=++i;      j=i++;

左侧的运算先使i增加1变成11,再将i的值赋给j,所以j的值是11。右侧的运算先将i的值赋给j,再将i增加1变成11,而j值是10。由此可见,前缀与后缀的运算过程是不同的。

如果单独使变量增1或减1,如:

i++;

则不用考虑前缀还是后缀。

2.关系运算符

关系运算符逻辑运算符

关系运算符用于比较两个量大小关系的运算,它通常用于表示运算条件。

关系运算符共有6个,分别是:>(大于)、>=(大于或等于)、<(小于)、<=(小于或等于)、==(等于)和!=(不等于),它们都是二元运算符。

由关系运算符连接操作数所形成的式子称为关系表达式。关系表达式的语法形式:

操作数1 关系运算符 操作数2

“操作数1”和“操作数2”的数据类型都是数值型。

关系运算的结果是一个逻辑值:true或false。

关系运算符中>、>=、<和<=的优先级相同,==和!=的优先级相同,后两个的优先级小于前4个。

算术运算的优先级高于关系运算。例如:

a+b>c+d等价于(a+b)>(c+d);

x+y==z等价于(x+y)==z;

b*b-4*a*c>=0等价于(b*b-4*a*c)>=0。

3.逻辑运算符

逻辑运算可以看作是连接运算。

一个关系运算只能表示一个条件。如果一个问题有多个条件,这时可以用逻辑运算将多个条件连接在一起。如算术不等式:

x>y 或 a<=b

写成等价的Java表达式就要用到逻辑运算:

x>y || a<=b

逻辑运算符有&&(逻辑与)、||(逻辑或)和!(逻辑非)。前两个是二元运算符,后一个是一元运算符。

由逻辑运算符连接操作数所形成的式子就是逻辑表达式。逻辑表达式的语法形式:

 

操作数1 逻辑运算符 操作数2

!操作数

操作数1、操作数2和操作数的值的类型必须是逻辑型(布尔型)。逻辑运算的结果仍然是逻辑值。表2-3所列的是逻辑运算的结果(真值表)。

表2-3 逻辑运算的结果

其中a和b是关系或逻辑表达式。

除运算符()、[]和.外,!(逻辑非)运算符的优先级比其他运算符的优先级都高,&&和||的优先级低于关系运算符,而&&的优先级比||高。如:

 

a>b && c>d 等价于 (a>b)&&(c>d)

!b==c||d<a 等价于 ((!b)==c)||(d<a)

a+b>c&&x+y<b 等价于 ((a+b)>c)&&((x+y)<b)

4.位运算符

位运算符

计算机内部表示数时是用二进制表示的。有时候想获得一个数中的某一位或某几位,就可以通过位运算来实现。

位运算符有&(位与)、|(位或)、~(位反)、^(位异或)、<<(位左移)、>>(位右移,算术右移)和>>>(无符号位右移),其中的“~”是一元运算符,其余的是二元运算符。

(1)位与运算

两个操作数的对应二进位进行与运算。如果对应位都是1,则位与结果为1,否则为0。例如“25&-12”运算,可以用下面的式子完成计算(以一个字节为例):

(2)位或运算

两个操作数的对应二进位进行或运算。如果对应位都是0,则位或结果为0,否则只要有一位为1则结果为1。例如“25|-12”运算,可以用下面的式子完成计算(以一个字节为例):

(3)位反运算

一个操作数的各个二进位按位取反,原来是1的变成0,原来是0的变成1。例如“~-12”运算,可以用下面的式子完成计算(以一个字节为例):

(4)位异或运算

两个操作数的对应二进位进行异或运算,异或运算是取不同。如果对应位不同,则位异或结果为1,否则结果为0。例如“25^-12”运算,可以用下面的式子完成计算(以一个字节为例):

(5)位左移运算

将一个操作数的各个二进位顺序往左移动若干位。移动后,空出的低位用0填充,移出的高位舍弃不要。位左移运算的表达式形式:

操作数<<移动的位数

例如“-12<<3”运算是将-12的各位顺序往左移动3位,可以用下面的式子完成计算(以一个字节为例,斜体是原来的位):

结果为-96,相当于-12*23。实际上,把一个数往左移动n位,相当于该数与2n相乘。移位运算比乘法运算快。

(6)位右移运算>>

将一个操作数的各个二进位顺序往右移动若干位。移动后,空出的高位用原来的高位值填充,也就是,如果原来的高位是1,则空出的高位都用1填充;如果原来的高位是0,则空出的高位都用0填充。移出的低位舍弃不要。位右移运算的表达式形式:

操作数>>移动的位数

例如“-12>>3”运算是将-12的各位顺序往右移动3位,可以用下面的式子完成计算(以一个字节为例,斜体是原来的位):

结果为-2(实际结果为-1.5,但因为是整数,所以取比-1.5小的最大整数-2),相当于-12/23。实际上,把一个数往右移动n位,相当于该数被2n除。移位运算比除法运算快。

位右移运算可以使结果的符号与原操作数的符号相同。

(7)无符号位右移运算>>>

将一个操作数的各个二进位顺序往右移动若干位。移动后,空出的高位全部用0填充,移出的低位舍弃不要。无符号位右移运算的表达式形式:

操作数>>>移动的位数

例如“-12>>>3”运算是将-12的各位顺序往右移动3位,可以用下面的式子完成计算(以一个字节为例,斜体是原来的位):结果为30。

对于负数,无符号位右移的结果与原数差别较大。

5.条件运算符

条件运算符

条件运算符是“?:”,可以根据条件进行计算。使用时的语法形式:

关系或逻辑表达式(条件)?表达式1:表达式2

计算时,先计算“关系或逻辑表达式”的值,如果该值为“true”,则整个表达式的值就是“表达式1”的值,否则就是“表达式2”的值。例如,找出整型数a和b中的大值,可以用关系运算符计算:

max=a>b?a:b;

max=b<a?a:b;

条件运算符的优先级高于赋值运算符,但低于其他运算符。结合性是右结合。

再看一个条件表达式(c是整型变量,表示天气温度):

c<15?"有点冷":c<25?"感觉舒适":c<30?"有点热":"太热了"

它的等价表达式:

c<15?"有点冷":(c<25?"感觉舒适":(c<30?"有点热":"太热了))"

6.赋值运算符

赋值运算符执行赋值运算。可以将赋值运算符分为基本的赋值运算符和扩展的赋值运算符。

(1)基本的赋值运算符

基本的赋值运算符即“=”。

可以通过赋值运算将变量初始化,更多情况下,通过赋值将表达式的运算结果保存在变量中。

由赋值运算符连接操作数所形成的式子称为赋值表达式。它的语法形式:

变量=表达式

赋值运算符的左侧必须是变量,右侧是合法的表达式(常数、单一变量都是表达式的特例)。例如:

x1=(-b+Math.sqrt(b*b-4*a*c))/(2*a);

将右侧表达式的值赋给变量x1(或者说,将方程的根保存在变量x1中)。

“表达式”的值的数据类型不能高于变量的数据类型(如表达式的值的类型为double,变量的类型为int,则编译不能通过,反之则可以)。

赋值表达式的作用在于将“表达式”的值赋给变量,赋值后,变量原来的值被覆盖(丢失)。

赋值表达式本身也是表达式,其值就是赋值后的变量的值。如,已定义整型变量a和b,可以用如下方式赋值:

a=b=12;

赋值运算符的结合性为从右往左,所以“12”和“b”先结合,形成表达式“b=12”,该表达式的值就是变量b的值,再将该值赋给变量a,最后可以得到a和b的值都是12。

(2)扩展的赋值运算符

扩展的赋值运算符是由基本的赋值运算符与算术运算符和位运算符组合而成的运算符。扩展的赋值运算符共11个,包括:+=、-=、*=、/=、%=、&=、|=、^=、<<=、>>=和>>>=。

扩展的赋值运算符使用的语法形式:

变量 扩展的赋值运算符 表达式

同样,赋值运算符的左侧必须是变量,右侧是表达式,赋值时类型要匹配。如:它的等价形式:

x=x*(a+b)

将一个扩展的赋值表达式转换成基本的赋值表达式,可以通过下面的步骤完成。

(1)将右侧表达式加括号:

x*=(a+b)

(2)再将左侧的“x*”移到赋值号右侧:

=x* (a+b)

(3)最后再在赋值号左侧加上变量x:

x=x*(a+b)

使用扩展的赋值运算符可以提高编译速度。

赋值运算符的优先级在所有的运算符中最低,也就是,所有其他运算都执行完后才能执行赋值运算。其结合性是右结合。

7.类型比较运算符

instanceof是类型比较运算符,用于判断某一个对象是否是某一个类或其子类的实例,如果是,则表达式的值为“true”,否则为“false”。它的语法形式:

对象 instanceof 类名

类型比较运算符的优先级较高,结合性是左结合。

关于instanceof的详细讲解参见第4章。

以上介绍了Java中的运算符。除了已介绍的运算符,“()”“ []”(下标运算符)和“.”(分量运算符)也是运算符,它们的优先级最高,结合性是左结合。“()”可以用于表达式中,改变运算次序,还可以用于函数的定义与调用。

表2-2是从运算符的用途角度进行了分类。下面再从运算符的优先级角度进行一下分类,见表2-4。

表2-4 运算符的优先级和结合性

续表

从表2-3中可以看到,只有优先级为2、13和14的运算符的结合性是右结合,其余全是左结合。

在写表达式时:

(1)不要一次写成一个很复杂的表达式;

(2)可以先写几个简单的表达式,简单表达式的值再进行运算;

(3)如果掌握不好优先级和结合性,可以用“()”改变运算次序。