========================================
===>>> 第二章 Java的数据类型 <<<===
========================================
§2-1 数据类型
一、首先要明确的是:
在Java语言中,Java是不支持C语言还有C++语言中的指针、结构体类型以及共用类型的。
在Java语言中,简单(或基本)数据类型分了以下八种:
字节型(byte)、短整型(short)、整型(int)、长整型(long)、字符型(char)、浮点型
(float)、双精度型(double)、布尔型(boolean)
在这些当中,又可以分为四组:
1、整数:该组包括字节型(byte)、短整型(short)、整型(int)、长整型(long)、它们有符
号整数。
2、浮点型数:该组包括浮点型(float)、双精度型(double)、它们代表有小数精度要求的数字。
3、字符:这个组包括字符型(char),它代表字符集的符号,例如字母和数字。
4、布尔型:这个组包括布尔型(boolean),它是一种特殊的类型,表示真(true)/假(false)值
。
各个数据类型在内存中所占用的内存如下表,因为Java语言具有可移植性,所在在内存的占用上面,
各种机型都是一样的:
序号简单类型大小/位数范围/精度
1float4 字节/32位32位IEEE 754单精度
2double8 字节/64位64位IEEE 754双精度
3byte1字节/8位-128到127
4short2 字节/16位-32,768到32,767
5int4 字节/32位-2,147,483,648到2,147,483,647
6long8 字节/64位-9,223,372,036,854,775,808到9,223,372,036, 854,775,807
7char2 字节/16位整个Unicode字符集
8boolean1 位True或者false
§2-2 常量
Java中的常量是用文字串来表示的。比如:
整形:123 实型:1.23 字符型:'a' 布尔型:true,false 字符串:"china"。
并且,在Java中, 不能通过#define命令来把一个标识符定义为常量,而是用关键字“final”来实
现,例如:final double PI=3.14159(具体的final用法见后)。
§2-3 变量
在编程的学习过程中,变量都是一个重要的概念,那么在Java中,变量包含的内容是:变量名、变量
类型和作用域三个部分。
1、变量名:一个合法的变量名应该由字母、数字、下划线或者美元符号“$”来表示;Java对于变量
名的大小写要敏感;变量名不能使用数字来开头;并且和C以及C++一样,不能用保留字(关键字)来命名
。下面列举一些合法的变量名,如:myName、value_1、dollar$……等等都是合法的变量名,再列举一些
不合法的变量名,如:2mail、room#、class……等等这些都是不合法的变量名。我们在命名的时候,最
好是使变量名具有一定的含义,这样可以增加整个程序的可读性。
2、变量类型:变量类型可以是上面任意的一个类型。
3、作用域:变量的作用域是指明可访问该变量的一段代码。我们在声明一个变量的同时,也就指明
了变量的作用域。按照作用域来划分,变量可以划分成以下几种:
(1)局部变量:在方法或方法的一块代码中声明,它的作用域为它所在的代码块(整个方法或方法
中的某块。)
(2)类变量:是在类中声明,而不是在类的某个方法中声明,它的作用域是整个类。
(3)方法参数:传递给方法,它的作用域就是这个方法。
(4)例外处理参数:传递给例外处理代码,它的作用域就是例外处理部分。
在一个确定的域中,变量应该是唯一的。通常,一个域是用“{”和“}”来划定的。
变量的声明格式是:
type identifier[=value][,identifier[=value]...];
例如: int a , b , c ; double d1 , d2 = 0.0 ;
其中,多个变量之间用逗号“,”隔开,d2 = 0.0是对双精度实型变量“d2”赋初值“0.0”。
注意:只有“局部变量”和“类型变量”可以给出这样赋初值的,而“方法参数”和“例外处理参数
”的变量值是由调用者给出的。
§2-4 整型数据
一、整型常量
和C/C++相比,Java的整型常量具有以下三种形式:
1、十进制整数:如:123、-456、0……等等
2、八进制整数:以“0”开头的,如:0123表示十进制数83,-011表示十进制数-9……等等
3、十六进制整数:以“0x”或“0X”开头,如:0x123表示十进制数291,-0X12表示十进制数-18。
对于 int 型的整型常量在机器中占32位,而对于long型的常量在机器中要占用64位,并且在表示
long型的时候,要在后面加上“l”或“L”符号来表示,如:123l、456L……等等。
二、整型变量
整型变量的类型有四种,分别是:byte、short、int、long。
对于以上四种类型,int类型是最常使用的。但对于大型计算,常会遇到很大的整数,超出int类型所
表示的范围,这时,就要使用long型。
由于不同的机器对于多字节数据的存储方式不同,可能是从低字节向高字节存储,也可能是从高字节
向低字节存储,这样,在分析网络协议或文件格式时,为了解决不同机器上的字节存储顺序的问题,就用
byte类型来表示数据是合适的。而通常情况下,由于其表示的数据范围很小,容易造成溢出,应避免使用
。
short类型则很少使用,它限制数据的存储为先高字节,后低字节,这样在某些机器中会出错 。
§2-5 实型(浮点型)数据
一、实型常量
与C/C++相同,Java的实常数有两种表达形式:
1、十进制数形式。有数字和小数点组成,并且必须有小数点,如:0.123、.123、123.、123.0……
等等都可以。
2、科学记数法形式。如:123e4或者123E4,其中,“e”或者“E”前面必须有数,并且后面的指数
必须是整数。
实常数在机器中占64位,具有double型的值。对于float型的值,则要在数字后面加上“f”或者“F
”,如:12.3f或45.6F,它在机器中占32位,表示的精度较底。
§2-6 字符型数据
一、字符型常量
字符型常量是用单引号('')括起来的一个字符,如:'a'、'B'……等等。另外,Java也提供一些转
义字符,以反斜杠“\”开头,各种转义字符的意思如下:
\ddd 1到3位8进制数据所表示的字符(ddd)
\uxxxx 1到4位16进制数所表示的字符(xxxx)
\'单引号字符\\反斜杠字符
\r回车\n换行
\f走纸换页\t横向跳格
\b退格
但还是要注意:与C/C++不同,Java中的字符型数据是16位无符号型数据,它表示Unicode集,而不仅
仅是ASCII集,例如:\u0061表示ISO拉丁码的‘a’。
二、字符型变量
和C/C++不一样,Java中的字符型数据不能作为整数来用,因为Java不提供无符号整数类型。但是,
同样可以当作整数来操作,如下例子:
int three = 3 ;
char one = '1' ;
char four = ( char ) ( three + one ) ;
在上例中,在计算加法时,字符型变量one被转化成整数进行相加,最后把结果又转化成字符型。
三、字符串常量
与C/C++不同,Java的字符串常量是作为String类的一个对象来处理的,而不是一个数据。
与C/C++相同,Java的字符串常量也是用“""”括起来的一组字符。
§2-7 布尔型数据
布尔型数据只有两个值,true(真)和false(假),且它们不对应于任何整值。在流控制中常用到
它。
现在,请看下面的这个例子,用到了前面讲的全部数据类型,并且通过显示器显示它们:
public class SimpleTypes
{
public static void main( String args[] )
{
byte b=0x55;
short s=0x55ff;
int i=1000000;
long l=0xfffL;
char c='c';
float f=0.23F;
double d=0.7E-3;
boolean bool=true;
System.out.println("b = "+b);
System.out.println("s = "+s);
System.out.println("i = "+i);
System.out.println("l = "+l);
System.out.println("c = "+c);
System.out.println("f = "+f);
System.out.println("d = "+d);
System.out.println("bool = "+bool);
}
}
编译并运行该程序,输出结果为:
C:\>java SimpleTypes
b = 85
s = 22015
i = 1000000
l = 4095
c = c
f = 0.23
d = 0.0007
bool = true
§2-8 各类数值型数据之间的混合运算
一、自动类型转换
在整型、实型、字符型数据之间,不同类型之间可以混合运算,但是必须先转换成同一类型,然后进
行运算,其转换的规则是:
① ( byte 或 short ) op int → int
② ( byte 或 short 或 int ) op long → long
③ ( byte 或 short 或 int 或 long ) op float → float
④ ( byte 或 short 或 int 或 long 或 float) op double → double
⑤ char op int → int
箭头左边表示参与运算的数据类型,op为运算符(如加、减、乘、除等),右边表示转换成进行运算
的数据类型。
二、强制类型转换
高级数据要转换成低级数据,需用到强制类型转换,如:
int i;
byte b=(byte)i; //把int型变量“i”强制转换为byte型
这种使用可能会导致溢出或精度的下降,最好不要使用。
§2-9 补充内容
Java的简单数据类型
Java中的所有数字变量都是有符号的,Java不允许数据类型之间随意的转换。只有数字变量之间可以
进行类型转换。比如,boolean就不能转换为其他数据类型,而且其他数据类型也不能转换为boolean。
因为Java的简单数据类型都经过准确定义,而且直接内存访问也是不允许的,所以在Java语言中取消
了sizeof运算符。
Java的简单数据类型并不是对象。为了采用面向对象方式对待Java简单数据类型,你需要首先用类封
装它们。
封装类
Java还提供了Byte、Short、Boolean、Character、Integer、Double、Float和Long等内置的封装类
。这些封装(wrapper)类提供了很直观的实用方法。比如:Byte、Float, Integer、Long和Double类都
具有doubleValue()方法,通过它可以把存储在类的实例中的值转换为Double类型。还有,所有的封装类
都提供了静态的valueOf(String s)方法把给定的String转换为对应的简单类型。清单A的代码演示了这些
封装类的一些用法。
简单数据类型初始化
在Java语言中,简单数据类型作为类的成员变量声明时自动初始化为默认值,除非显式地声明。简单
数据类型为某一方法声明局部变量时不会自动地初始化而且会导致编译器扔出类似以下的错误消息
“Variable x may not have been initialized.(x变量没有初始化)”表B定义了Java简单数据类型的
默认值。
Java简单数据类型的默认值
类型默认值
booleanfalse
Byte0
short0
int0
Long0
Char'\u0000'
Float0.0
double0.0
Java简单数据类型的默认初始值
上面的代码显示所有的Java简单数据类型都用做了Initialization类的成员变量。该例还显示
Initialization类的构造器中局部声明了一个int变量。在不修改以上代码的情况下,编译器会在对以上
代码进行编译的时候扔出错误。
一旦引发问题的代码行(那些引用未初始化变量导致错误发生的代码)被删除或者注释掉。程序成功
编译和执行之后就会显示以下的结果:
byte: 0
short: 0
int: 0
long: 0
float: 0.0
double: 0.0
char: 0
boolean: false
我们还可以显式地初始化成员变量为其他值,如以下代码所示:
byte b = 5;
short s = 123;
int i = 1234;
long l = 12345;
float f = 123.45f;
double d = 12345.678;
char c = 'A';
boolean z = true;