Java语言是强类型(strongly typed)语言,强类型包含两方面的含义:①所有的变量必须先声明、后使用:②指定类型的变量只能接受类型与之匹配的值。这意味着每个变量和每个表达式都有一个在 编译时就确定的类型。类型限制了一个变量能被赋的值, 限制了一个表达式可以产生的值,限制了在这些值上可以进行的操作,并确定了这些操作的含义。
强类型语言可以在编译时进行更严格的语法检查,从而减少编程错误。
声明变量的语法非常简单,只要指定变量的类型和变量名即可,如下所示:
type varName[ =初始值] ;
上面语法中,定义变量时既可指定初始值,也可不指定初始值。随着变量的作用范围的不同(变量有成员变量和局部变量之分,具体请参考本书5.3节内容),变量还可能使用其他修饰符。但不管是哪 种变量,定义变量至少需要指定变量类型和变量名两个部分。定义变量时的变量类型可以是Java 语言支持的所有类型。
Java语言支持的类型分为两类:基本类型(Primitive Type)和引用类型( Reference Type)。
基本类型包括boolean类型和数值类型。数值类型有整数类型和浮点类型。整数类型包括byteshot int、long、 char, 浮点类型包括float 和double。
char代表字符型,实际上字符型也是一种整数类型,相当于无符号整数天。一个对
引用类型包括类、接口和数组类型,还有一种特殊的null 类型。所谓引用数据类型就限象的引用,对象包括实例和数组两种。实际上,引用类型变量就是一一个指针,只是Java
空类型(null type)就是null值的类型,1这种类型没有名称。因为null类型没有名称,所以不可能 声明一个null类型的变量或者转换到null类型。空引用(nul)是null类型变量唯一的值。 空引用(nul
在实际开发中,程序员可以忽略null类型,假定null只是引用类型的一个特殊直接量。
空引用(null)只能被转换成引用类型,不能转换成基本类型,因此不要把一个null值赋给基本数据类型的变量。
Java的基本数据类型分为两大类: boolean 炎型和数
值类型。而数值类型又可以分为整数类型和浮点类型,
整数类型里的字符类型也可被单独对待。因此常把Java
里的基本数据类型分为4类,如图3.8所示。
Java只包含这8种基本数据类型,值得指出的是,
字符串不是基本数据类型,字符串是一个类,也就是:
整型
通常所说的整型,实际指的是如下4种类型。
byte:一个byte类型整数在内存里占8位,表数
范围是: -128(-2)~ 127(27-1)。
short:一个 short类型整数在内存里占16位,表数范围是: -32768(-215)~ 32767(215-1)。
int:一个int类型整数在内存里占32位,表数范围是: -2147483648(- 231) ~ 2147483647(231-1)。 ➢long: 一个long类型整数在内存里占64位,表数范围是: ( 263)~ (263-1)。
int是最常用的整数类型,因此在通常情况下,直接给出一个整数值默认就是int类型。除此之外,有如下两种情形必须指出。
如果直接将一个较小的整数值(在byte或short类型的表数范围内)赋给一个byte或short变量, 系统会自动把这个整数值当成byte或者short 类型来处理。
如果使用一个巨大的整数值(超出了int类型的表数范围)时,Java不会自动把这个整数值当成long类型来处理。如果希望系统把一个整数值当成long类型来处理,应在这个整数值后增加1或者L作为后缀。通常推荐使用L,因为英文字母1很容易跟数字1搞混。
下面的代码片段验证了上面的结论。
下面代码是正确的,系统会自动把56当成byte类型处理
byte a = 56;
下面代码是错误的,系统不会把 999999999999当成long类型处理
所以超出int的表数范围,从而引起错误
long biqValue = 99999999999;
下面代码是正确的,,在巨大的整数值后使用L后缀,强制使用long类型 long bigValue29223372036854775807L;
Java中整数值有4种表示方式:十进制、二进制、八进制和十六进制,其中二进制的整数以0b 0B开头:八进制的整数以0开头;十六进制的整数以0x或者0X开头,其中10~15 分别以a~f (此从的a~f不区分大小写)来表示。
下面的代码片段分别使用八进制和十六进制的数。
//以0开头的整数值是八进制的整数
int octalvalue = 013;
//以0x或0X开头的整数值是十六进制的整数
int hexValuel = 0x13;
int hexValue2 = 0XaF;
在某些时候,程序需要直接使用二进制整数,二进制整数更“真实”,更能表达整数在内存中的存在形式。不仅如此,有些程序(尤其在开发-一些游戏时)使用二进制整数会更便捷。
Java7新增了对二进制整数的支持,二进制的整数以0b或者0B开头。程序片段如下。
//定义两个8位的二进制整数
int binVall = 0b11010100;
byte binVal2 = 0B01101001;
//定义一个32位的二进制整数,最高位是符号位
int binVal3 = 00100000000000000000000000000011;
System. out . println (binVa1l); //输出212
System. out.println(binVal2); // 输出105
System. out .println(binval3); //输出-2147483645
从上面粗体字可以看出,当定义32位的二进制整数时,最高位其实是符号位,当符号位是1时,表明它是一个负数,负数在计算机里是以补码的形式存在的,因此还需要换算成原码。
正如前面所指出的,整数值默认就是int类型,因此使用二进制形式定义整数时,二进制整数默认占32位,其中第32位是符号位:如果在三进制整数后添加1或L后缀,那么这个二进制整数默认占64位,其中第64位是符号位。
例如如下程序。
/*定义一个8位的二进制整数。该数值默认占32位,因此它是一个正数
只是强制类型转换成byte时产生了溢出,最终导致binVal4变成了-23
*/
byte binVal4市(byte) 0b11101001;
/*定义一个32位的二进制整数,最高位是1
但由于数值后添加了工后缀,因此该整数实际占64位,第32位的1不是符号位
因此binVal5的值等于2的31次方+2+1
*/
long binVal5二000000000000000000000
System. out.println(binVa14); //输出-23
System. out.println(binVal5); //输出2147483651
上面程序中粗体字代码与前面程序片段的粗体字代码基本相同,只是在定义二进制整数时添加了“L”后缀,这就表明把它当成long类型处理,因此该整数实际占64位。此时的第32位不再是符号位,因此它依然是一个正数。
至于程序中的byte binVal4 = (byte)0b11101001;代码,其中0611101001依然是一个32位的正整数,只是程序进行强制类型转换时发生了溢出,导致它变成了负数。
字符型
字符型通常用于表示单个的字符,字符型值必须使用单引号(') 括起来。Java 语言使用16 位的Unicode字符集作为编码方式,而Unicode被设计成支持世界上所有书面语言的字符,包括中文字符,因此Java程序支持各种语言的字符。
字符型值有如下三种表示形式。➢直接通过单个字符 来指定字符型值,例如'A'、 '9和0等。
如果把0- 6535范围内的一个int整数赋给char 类型变量,系统会自动把这个int整数当成ch型来处理。
下面程序简单示范了字符型变量的用法。
public static void main(String[] args){
//使用转义字符来作为字符值
char enterChar = '\r';
//使用Unicode编码值来指定字符值
char ch = '\u9999' ;
1/将输出一个'香'字符
System.out.println(ch);
1/定义一个'疯字符值
char zhong=‘疯'
//直接将一个char变量当成int类型变量使用
int zhongValue azhongi ialuel:
11直接把一个0~65535范围内的int整数赋给一个 char变量
//直接把一个0
system.out.println(c);
}