第三章

基本语言元素

3.1 基本数据类型

Java是一种强类型语言,数据在使用前必须预先声明其类型,编译程序首先简称操作数的类型是否匹配,不匹配就要报告编译错误。数据类型有两种:基本数据类型和参考类型(reference)。参考类型有类(class)、接口(interface)和数组(array)三种,我们将在后面的章节中介绍它们。基本数据类型也称为主类型(Primitive),与类名不同,类型符首字母是小写的。基本数据类型共有8

种,如下表所示:

主类型

中文名

大小

最小值

最大值

缺省值

封装器类型

boolean

布尔

1-bit

false

ture

false

Boolean

char

字符

16-bit

Unicode

0

Unicode

216- 1

'\000'即

'\u0000'

Character

byte

字节

8-bit

-128

+127

0

Byte

short

短整数

16-bit

-215

+215 –

1

0

Short1

int

整数

32-bit

-231

+231 –

1

0

Integer

long

长整数

64-bit

-263

+263 –

1

0L

Long

float

单精度浮点数

32-bit

IEEE754

IEEE754

0.0F

Float

double

双精度数

64-bit

IEEE754

IEEE754

0.0D

Double

void

无类型

用于不需要返回值的方法声明

Void

数值类型都是有符号的,没有无符号类型。主数据类型也拥有自己的“封装器”(wrapper)类。这意味着假如想让堆内一个对象表示那个主类型,就要使用对应的封装器。例如:

char c = 'x';

Character C = new Character('c');

也可以直接使用:

Character C = new Character('x');

用主类型声明的变量储存的是数据的值,用类名声明的“变量”称为对象的句柄,或对象的引用,对象的实例,相当于C语言中的指针,它储存的是对象的内存地址。

表示浮点数的常量时数值后加“F”,例如float num =

3.1415F。用双精度数时可以加“D”,但可以省略,即缺省表示默认为双精度。

主类型中6种都是数值型,只有一种为字符型。与C/C++不同,Java中char型不是8位ASCII码字符集,而是Unicode字符集,其值范围为'\u0000'到'\uFFFF'。它是子集'\u0000'到'\u00FF'与ASCII码字符集重合。字符常量有单引号表示,例如'A',

'a', '\u0040'等。Java提供了一些转义字符用来表示某些特主字符。

转义符

描述

Unicode值

\ddd

八进制字符

与ddd相应的16进制值

\uxxxx

Unicode码

\uxxxx

\b

退格

\u0008

\f

缩进

\u000c

\t

制表符

\u0009

\n

换行符

\u000a

\r

回车符

\u000d

\'

单引号

\u0027

\"

双引号

\u0022

\\

反斜杠

\u005c

基本类型的自动转换

在运行中如果操作数类型不一致,但有联系例如都是数值,Java会按照一定的规则自动转换。例如

short a =12;

int b =24;

System.out.println(a+b);

编译器把a转换成int类型。对byte,short,int,

long实施转换时把位(bit)少的转换成多的。例如float和double运算的结果转换为double;如将一个int和一个long值相加,则结果为long;如果是int

和 float运行,则结果为float。如果必须作反方向转换,可以使用强制转换,即在变量前加上类型符(要带括号),例如

float a =12.56;

int b =24;

System.out.println((int)a + b);

因为是把位多的转换成位少的,空间减少了,可能会导致信息丢失(精度下降或溢出)。

3.2 运算符

Java是建立在C++基础上的,Java的运算符几乎全盘继承了C++的运算符。下表给出了各种类型的运算符,我们假定读者对它们的含义是不喻自明的。然后对某些运算符的用法做一些简要说明。

运算符分类

符号集

简要说明

算术运算符

+ - * / % ++ --

关系运算符

== != >=

<= > <

逻辑运算符

&& || !

与、或、非

位运算符

& | ~ ^ >> <>>

与或反异或,右移左移无符号移位

赋值运算符

= += -= *= /= %= &= |=

^= >>=

<<=

>>>=

op=赋值中op可以是简单算术符和位运算符

条件运算符

?:(格式为 booleanExp?vlaue1:value2)

true=vlaue1 and faslse=value2

其它运算符

, . new () []

instaceof

算术运算符

算术运算符中整数除法会直接砍掉小数,而不会进位。+-运算符还可以是一元的,如例如语句:

x = +a; 相当于x = x+a;

x = -b; 相当于x = x-b;

编译器能正确识别下述语句x = a * -b; 但读者会被搞糊涂,所以最好写成:x = a * (-b);

++和--称为自动递增和递减运算符。对于前递增和前递减(如++A或--A),会先执行运算,再生成值。而对于后递增和后递减(如A++或A--),会先生成值,再执行运算。

字串运算符+

运算符+还可以用来连接两个字符串。这是特殊的情况,因为可以运算的操作数一般都是基本类型,而字串运算符+是个例外。值得注意的是,若表达式中包含一个String,那么其它操作数都必须是字串。如下所示:

int x = 0, y = 1, z = 2;

String s = "No";

System.out.println(s + x + y + z);

在这里,编译程序会将x,y和z转换成它们的字串形式,而不是先把它们加到一起。输出为"No012"。

移位运算符

移位运算符面向的运算对象也是二进制的“位”。可单独用它们处理整数类型(主类型的一种)。左移位运算符(<>)则将运算符左边的运算对象向右移动运算符右侧指定的位数。“有符号”右移位运算符使用了“符号扩展”:若值为正,则在高位插入0;若值为负,则在高位插入1。Java也添加了一种“无符号”右移位运算符(>>>),它使用了“零扩展”:无论正负,都在高位插入0。这一运算符是C或C++没有的。

若对char,byte或者short进行移位处理,那么在移位进行之前,它们会自动转换成一个int。只有右侧的5个低位才会用到。这样可防止我们在一个int数里移动不切实际的位数。若对一个long值进行处理,最后得到的结果也是long。此时只会用到右侧的6个低位,防止移动超过long值里现成的位数。

其它运算符

逗号运算符在C和C++里,逗号不仅作为函数自变量列表的分隔符使用,也作为进行后续计算的一个运算符使用。在Java里需要用到逗号的唯一场所就是for循环的控制表达式。在控制表达式的初始化和步进控制部分,我们可使用一系列由逗号分隔的语句,那些语句均会独立执行。下面是另一个例子:

///public class CommaOperator {

public static void

main(String[] args) {

for(int i = 1, j = i

+ 10; i < 5;

i++, j = i * 2) {

System.out.println("i= " + i +

" j= " + j);

}

}

}

///

输出如下:

i= 1 j= 11

i= 2 j= 4

i= 3 j= 6

i= 4 j= 8

圆点运算符用来分隔对象和它的成员或方法,例如System.out.println,System对象或类名,out是它的一个成员,println是out的方法。

new运算符用来新建一个对象,例如new

String("abc")。

()运算符的用途有:一改变运算次序,二方法的声明和调用时,三用于强制类型转换时的类型符。

[]运算符用于数组,表示数组类型,或数组的大小,数组的元素。

instaceof 用来判断一个标识符是不是某个对象的实例,结果为一布尔值。例如s

instanceof String 。

运算符的优先级

下表中运算符位于上行的优先于位于下行的。同级运算符一般按自左向右的次序,但赋值运算符是例外。

运算符

[] ()

+a -a ++ -- new ! ~

* / %

+ -

>>

<<

>>>

instanceof <

<= > >=

== !=

&

^

|

&&

||

?:

赋值运算符