在Java语言中,每个变量(常量)都有其数据类型。不同的数据类型可允许的操作也是不尽相同的。比如,对于整型数据,它们只能进行加减乘除和求余的操作。此外,不同的数据占据的内存空间大小也是不尽相同的。而在必要时,不同的数据类型也是可以做到强制类型转换的。
在Java之中,数据类型一共分为两大类:基本数据类型、引用数据类型。
在Java中规定了 8 种基本数据类型变量来存储、浮点数、字符和布尔值。如下所示:
数据类型 | ||
基本数据类型 | 数值型 | 整数类型:byte、short、int、long |
浮点类型:float、double | ||
字符型 | char | |
布尔型 | boolean | |
引用数据类型 | 类 | class |
接口 | interface | |
数组 | array |
不同类型的变量,其能表示的数据范围也是不同的。Java的基本数据类型占用内存位数及可表示的数据范围如下表所示:
数据类型 | 位数(bit) | 可表示的数据范围 |
long(长整型) | 64位 | -9223372036854775808 ~ 9223372036854775807 |
int(整型) | 32位 | -2147483648 ~ 2147483647 |
short(短整型) | 16位 | -32768 ~ 32767 |
char(字符) | 16位 | 0 ~ 65535 |
byte(字节) | 8位 | -128 ~ 127 |
boolean(布尔) | 1位 | true 或 false |
float(单精度) | 32位 | -3.4E38(-3.4 x 10^38)~ 3.4E38(3.4 x 10^38) |
double(双精度) | 64位 | -1.7E308(-1.7 x 10^308)~ 1.7E308(1.7 x 10^308) |
整数类型(Integer),简称整型,表示的是不带有小数点的数字。一共有 4 种不同类型的整型,按照占据空间大小的递增次序,分别为byte(位)、short(短整型)、int(整数)及long(长整数)。默认情况下,整型指 int 型。
1.byte 类型
在Java中,byte类型占据1字节内存空间,数据的取值范围为: -128 ~ 127。
每种基本的数据类型都有几个静态属性,如MAX_VALUE(最大值)、MIN_VALUE(最小值)、SIZE(大小)、TYPE(类型)等。要得到这些值,可用名称为该类型首字母大写对象(如 byte 类型对应 Byte 对象)通过点( . )操作符将其读取出来。Byte 类将基本类型 byte 的值包装在一个对象中。一个 Byte 类型的对象只包含一个类型为 byte 的字段。
Byte 类常见的静态属性如下:
属性名称 | 属性值 |
MAX_VALUE | 最大值:2^7 - 1 = 127 |
MIN_VALUE | 最小值:-2^7 = -128 |
SIZE | 所占的内存位数(bit):8 位 |
TYPE | 数据类型:byte |
2.short 类型
short 类型数据占据 2 个字节内存空间,取值范围为:-32768 ~ 32767。
例如:获得短整数所能表达的最大数值(Short.MAX_VALUE)。
3.int 类型
int 类型数据占据 4 个字节内存空间,取值范围为:-2147483648 ~ 2147483647。
注意:由于每一种类型都有其对应范围的最大或最小值,如果在计算的过程之中,超过了此范围(大于或小于最小值),那么就会产生数据溢出(overflow)的问题。
扩展:lang 是 language(语言)的简写。
4.long 类型
long类型数据占据 8 个字节内存空间,取值范围为:-9223372036854775808 ~ 9223372036854775807。
注意:想要解决数据溢出问题,那么最好的做法是扩大数据的操作范围,比 int 范围大的是 long 类型,所以可将其扩充为 long,有两种方式扩充。
(1)直接在数据前增加一个“(long)”;
(2)直接在数据后增加一个字母“ L ”。
例:max + (long)1;或者 max + 2L;
低字节类型数据与高字节数据运算,其结果自动转变为高字节数据,因此,int 型与 long 型运算的结果是 long 型。
Java浮点数据类型主要有双精度 double 和单精度 float 两个类型。
double 类型:共 8 个字节,64 位,第 1 位为符号位,中间 11 位表示指数,最后 52 位为尾数。
float 类型:共 4 个字节,32 位,第 1 位为符号位,中间 8 位表示指数,最后 23 位为尾数。
1.float 类型
含小数点的实数默认为 double 类型数据,如果定义的是 float 型数据,为其赋值的时候,必须执行强制转型,有两种方式。
(1)直接加上字母 “ F ”,或小写字母 “ f ”。例如:“ float num = 1.5F; ” 或 “ float num = 1.5f; ”。
(2)直接在数字前加强转型为 “ float ”。例如:“float num = (float) 1.2; ”。
2.double类型
当浮点数的表示范围不够大的时候,还有一种双精度(double)浮点数可供使用。双精度浮点数类型的长度为 64 个字节,有效范围为:-1.7E308(-1.7 x 10^308)~ 1.7E308(1.7 x 10^308)。
Java提供了浮点数类型的最大值与最小值的代码,其所使用的类全名与所代表的值的范围,可以通过下表查询:
类别 | float | double |
使用类全名 | java.lang.Float | java.lang.Double |
最大值 | MAX_VALUE | MAX_VALUE |
最大值常值 | 3.4028235E38 | 107976931348623157E308 |
最小值 | MIN_VALUE | MIN_VALUE |
最小值常值 | 1.4E—45 | 4.9E—324 |
在类全名中,可以省去类库 java.lang,直接取用类名称即可。
字符就是字母和符号的统称。
字符类型在内存中占有 2 个字节,定义时语法为:
char a = 'A'; //声明 a 为字符型,并赋初值为 'A' 。
字符要用一对单引号( ' ' )括起。但如果把一个字符变量赋值成一个单引号,就有了转义字符的概念。转义字符就是用不容易混淆的字符来代替那些敏感字符,它们作为一个整体使用。
下表为常用的转义字符:
转义字符 | 所代表的意义 | 转义字符 | 所代表的意义 |
\f | 换页 | \\ | 反斜线 |
\b | 倒退一格 | \' | 单引号 |
\r | 归位 | \" | 双引号 |
\t | 跳格 | \n | 换行 |
不管使用变量存放转义字符,还是直接使用转义字符的方式来输出字符串。
Java 中默认采用的编码方式为 Unicode 编码,此编码是一种采用十六进制编码方案,可以表示出世界上的任意的文字信息。所以在 Java 中,单个字符里面是可以保存中文字符的,一个中文字符占据 2 个字节。这点是与 C/C++ 对字符型的处理是有区别的,在 C/C++中,中文字符只能当做长度为 2 的字符串处理。
注意:char 和 int 型数据的互相转换的问题。遵循 C 语言常用的 ASCII 码的习惯,字母的表示范围是: 大写字母 A ~ Z对应整数 65 ~ 90、小写字母 a ~ z 对应整数 97 ~ 122、字符 0 ~ 9 对应整数 49 ~ 57。
提示:ASCII(American Standard Code for Information Interchange,美国标准信息交换码)是计算机中用的最广泛的字符集及其编码,由美国国家标准局(ANSI)指定,已被国际标准化组织(ISO)定为国际标准。
布尔( Boolean )本是一位英国数学家的名字。在 Java 中使用关键字 boolean来声明布尔类型。被声明为布尔类型的变量,只有 true(真)和 false(假)两种。除此之外,没有其他的值可以赋值给这个变量。
声明布尔类型语句为true:
boolean 变量名 = ture; //声明布尔变量,并赋值为 true
布尔类型主要用于逻辑判断,通常用来控制程序的流程。
数据类型的转换方式可分为 “ 自动类型转换 ” 及 “ 强制类型转换 ” 两种。
1.自动类型转换
在程序中已定义好了的数据类型的变量,若想转换用另一种数据类型表示时,Java 会在下面 2 个条件皆成立时,自动进行数据类型的转换。
(1)转换前后的数据类型要相互兼容。在 C/C++ 中,整型和布尔类型的关系是 “ 非零即为真 ” —— 凡是不是零的整数都可以认为布尔值为真变量,二者是兼容的,所以可以相互转换。而在 Java 中,由于 boolean 类型只能存放 true 或 false ,与整数及字符不兼容,因此 boolean 类型不可能与其他任何数据类型进行转换。整数与浮点数亦是兼容的,所以可以相互转换。
(2)转换后的数据类型的表示范围不小于转换前的类型。Java 在进行数值运算时,以尽量不损失精度(正确性)为原则。因此需要将字符型的变量转换为整型变量,否则将 4 字节整型变量转换为 2 字节的字符型,很有可能导致整型变量的值会溢出,从而导致计算错误。字符与整数是可使用自动类型转换的。
其相互转换的规则如下:
操作数1类型 | 操作数2类型 | 转换后的类型 |
byte、short、char | int | int |
byte、short、char、int | long | long |
byte、short、char、int、long | float | float |
byte、short、char、int、long、float | double | double |
所以,自动数据类型转换的规律为:byte → short → char → int → long → float → double,按照范围由小到大实现自动转型操作。
2.强制类型转换
当程序需要转换数据类型时,可实施强制性的类型转换,其语法如下:
(欲转换的数据类型)变量名称;
当两个整数相除时,小数点以后的数字会被阶段,使得运算的结果保持为整数。而想得到浮点数结果,就必须将两个整数中的一个(或是两个)强制转换为浮点数,以下为 3 种正确的写法:
(1)(float)a/b; //将整数 a 强制转换成浮点数,再与整数 b 相除
(2)a/(float)b; //将整数 b 强制转换成浮点数,再与整数 a 除以
(3)(float)a/(float)b; //将整数 a 与 b 同时强制转换成浮点数,再相除
只要在变量前面加上欲转换的数据类型,运行时就会自动将此行语句里的变量做类型转换的处理,但这并不影响原先所定义的数据类型。此外,讲一个超出该变量可表示范围的值赋给这个变量,这种转换称为缩小转换。由于在转换的过程中可能会丢失数据的精确度,因此 Java 并不会 “ 自动 ” 做这些类型的转换,此时就必须要做强制性的转换。
在 Java 中,若在变量的声明时没有赋初始值,则会给该变量赋默认值。
下表为各类型的默认值:
数据类型 | 默认值 |
byte | (byte)0 |
short | (short)0 |
int | 0 |
long | 0L |
float | 0.0f |
double | 0.0d |
char | \u0000(空) |
boolean | false |
在某些情况下,Java 会给予这些没有赋初始值的变量一个确切的默认值,这个值没有任何意义,只是保证程序执行时,不运行有这种没有初始化值的变量存在。
1.整型数的除法要注意。
整数与整数运算,其结果还是整数。
2.C/C++ 语言和 Java 语言在布尔类型上存在显著差别。
C/C++遵循的规则是 “ 非零即为真 ”,即所有不是零的数,都可认为是 “ true ” ,而仅把 0 当做 false。
而 Java 语言的布尔类型变量,其赋值只能是 true(真)和 false(假)两种,所以,Java 语言中的布尔类型与整型无关。
自身能力的提升就是团队水平的提高!加油,Java!