数据类型
JAVA数据类型分为两大类:boolean类型和数值类型。数值类型又分为整数类型和浮点类型,整数类型中的字符类型可以被单独对待,如下图所示:
1.整型
byte:一个 byte 类型整数在内存当中占用8位,数值范围为:-128(-
2
7
2^{7}
27 ) ~ 127(
2
7
2^{7}
27-1)。字节类型和字符类型互不相干。
short:一个 short 类型整数在内存当中占用16位,数值范围为:-32768(-
2
15
2^{15}
215 ) ~ 32767(
2
15
2^{15}
215-1)。
int:一个 int 类型整数在内存当中占用32位,数值范围为:-2147483648( -
2
31
2^{31}
231 ) ~ 2147483647(
2
31
2^{31}
231-1)。
long:一个 long 类型整数在内存当中占用64位,数值范围为:(-
2
63
2^{63}
263 ) ~ (
2
63
2^{63}
263-1)。
int 是最常用的整数类型,因此在通常情况下,直接给出一个整数默认就是int类型。除此之外只有两种情况需要注意:
1.如果直接将一个较小的整数值(在byte或short类型的数值范围内)赋给一个byte或者short变量,系统会自动把这个整数值当做byte或者short类型来进行处理。
2.如果使用一个巨大的整数值(超出了int 类型的数值范围时),java不会自动将这个整数值当成long类型来处理。如果希望系统将这个数值当做long进行处理就需要在数值后加上l或L作为后缀(推荐使用L)。
Java中整数值有4中表示方法:十进制、二进制、八进制和十六进制,其中二进制的整数以0b或0B开头;八进制的整数以0开头;十六进制的整数以0x或者0X开头,其中10 ~ 15分别以a ~ f来表示。
2.字符型
字符型通常用于表示单个的字符,字符值必须使用单引号括起来。
字符型数值有三种表示形式:
1. 直接通过单个字符来指定字符型数值,例如‘A’、‘9’和’0’等。
2. 通过转义字符表示特殊字符型值,例如’\n’、’\t’等。
3. 直接使用Unicode来表示字符型值。
常用转义字符如下表所示:
转义字符 | 说明 | Unicode表达方式 |
---|---|---|
\b | 退格符 | \u0008 |
\n | 换行符 | \u000a |
\r | 回车符 | \u000d |
\t | 制表符 | \u0009 |
" | 双引号 | \u0022 |
’ | 单引号 | \u0027 |
\ | 反斜线 | \u005c |
如果把0 ~ 65535范围内的一个int 整数赋值给char类型,系统就会自动将这个int整数当做char类型处理。
3.字符串类型
Java中没有提供表示字符串的基本数据类型,而是通过String类型来表示字符串,由于字符串由多个字符串组成,因此字符串要使用双引号括起来。如下代码:
String str = "举头望明月,低头思故乡";
注意事项:
1. Java使用双引号 + 若干字符的方式表示字符串字面值。
2. String不为基本数据类型,而表示引用类型(String 、数组、类、接口、枚举)。
3. 在字符串当中不方便的字符需要通过转义字符来实现。
4. 字符串类型结尾并没有规定以‘\0’结尾。
4.浮点型
Java的浮点类型有两种: float 和 double 。Java的浮点类型有固定的数值范围和字段长度,字段长度的数值范围与机器系统无任何关系。
float类型代表单精度浮点数,double代表双精度浮点数。一个float类型的数值占4个字节、32位,一个double类型的数值占8字节、64位。
Java中的浮点数表示形式有两种:
1. 十进制数形式:例如:5.12、3.14、0.98。浮点数必须包含一个小数点,否该数值将会被当作int类型来处理。
2. 科学计数形式:例如5.12
e
2
e{2}
e2,5.12E2。
Java 语言的浮点类型默认表示为double类型,如果想要将浮点类型改变成 float类型处理,就需要在对数值幅值后缀紧跟f或F。
Java 提供了三个特殊的浮点数值:正无穷大 、负无穷大 和非数,用于表示数据的溢出和出错。正无穷大通过Double或Float类的POSITIVE_INFINITY表示;负无穷大通过Double或Float类的NEGATIVE_INFINITY表示,非数通过Double或者Float类的NaN表示。
所有的正无穷大数值都是相等的,所有的负无穷大数值都是相等的;而NaN不与任何数值相等,甚至与NaN都不相等。
只有浮点数除以0才可以得到正无穷大或负无穷大,因为Java语言会自动把和浮点数运算的0(整数)当成0.0(浮点数)处理。如果一个整数除以0,则会抛出一个算数异常:ArithException:/by zero(除以0异常)。
5.布尔型
布尔型只有一个boolean类型,用于表示逻辑上的“真”或“假”。在Java语言中,boolean类型的数值只能true或false,不能用0或者非0来表示。其他基本数据类型的值也不能转换成boolean类型。
字符串“true”和“flase”不会直接转换为boolean类型,但如果使用一个boolean类型的值和字符串进行连接运算,则boolean类型的值将会自动转换成字符串。
boolean类型有些JVM的实现是只占一个字节,有些是占一个比特位,并没有明确规定布尔类型字节的大小。boolean类型的默认值为false。
6.基本数据类型的类型转换
语言分为弱类型和强类型。数据类型不匹配依旧能够转换数据类型的语言为弱类型语言,如C语言;数据类型不匹配就会需要进行强制类型转换,否则就会发生编译错误,如Java。
在Java程序当中,不同的基本数据类型的值需要进行相互转换。Java语言中所提供的7中数值类型之间是可以相互转换的,有两种转换方式:自动类型转换和强制类型转换。
自动类型转换
Java所有数据类型都是可以相互转换,如果系统支持将某种基本类型的值直接赋值给另一种基本类型的变量,则这种方式就被称为自动类型转换。表数范围小的可以向表数范围大的进行自动类型转换,不会产生任何的问题。如下图所示箭头左边的数值类型就可以自动转换为箭头右边的数值类型:
当把任何基本类型的值和字符串值连接运算时,基本类型的值将会自动转换为字符串类型。因此,如果希望把基本类型的值转换为对应的字符串时,可以把基本类型的值和一个空字符串进行连接。
强制类型转换
如果需要将上图箭头右边的类型转换为左边的类型,则必须进行强制类型转换,强制类型转换语法为:(targetType)value,这样转换会导致数据丢失。
当试图强制将表数范围大的类型强制转换为表数范围小的类型时,必须格外小心,因为非常容易引起信息的丢失。
表达式类型自动提升
当一个算术表达式中包含有多个基本类型的值时,整个算术表达式的数据类型将会发生自动提升,以下是自动提升的规则:
1. 所有的 byte类型、short类型和char类型将被提升至int类型。
2. 整个算术表达式的数据类型自动提升到与表达式中最高等级操作数同样的类型。
变量
变量指的是程序在运行期间可以改变的量。相当于开辟一块内存空间来保存一些数据。
直接量 是指在程序当中通过源代码直接给出的量。
1.直接量的类型
能直接指定直接量的通常只有三种类型:基本类型、字符串类型和null类型。具体来说,Java支持如下8种类型的直接量。
1. int 类型的直接量: 在程序中直接给出的整型数值,可分为二进制、十进制、八进制和十六进制4种,其中二进制的整数以0b或0B开头;八进制的整数以0开头;十六进制的整数以0x或者0X开头,其中10 ~ 15分别以a ~ f来表示。
2. long 类型的直接量: 在整型数值后添加 l 或L 就变成了long类型的直接量。例如3L 、0x12L。
3. float 类型的直接量: 在整型数值后添加 f 或F 就变成了long类型的直接量。例如3.56f 、3.14E5f。
4. double 类型的直接量: 直接给出一个标准小数形式或者科学计数法形式的浮点数就是double类型的直接量。例如5.34、3.26E7。
5. boolean 类型的直接量: 这个类型的直接量只有true和false。
6. char 类型的直接量: char类型的直接量有三种形式,分别是用单引号括起来的字符、转义字符和Unicode值表示的字符。例如’a’,’\n’和’\u0002’。
7. String 类型的直接量: 一个用双引号括起来的字符序列就是String类型的直接量。
8. null 类型的直接量:这个类型只有一个值,即null。
在上面的八种类型直接量中,null类型是一种特殊类型,它只有一个值:null,而且这个直接量可以赋给任何引用类型的变量,所以表示这个引用类型变量中保存的地址为空,即未指向任何有效对象。
2.final修饰的常量
final int A = 15;
常量不能够在程序运行期间发生修改。
3.直接量的赋值
通常将一个直接量赋值给对应类型的变量,在Java中支持数值间的自动类型转换。String 类型的直接量不能够直接赋给其他类型的变量,null类型的直接量可以直接赋给任何引用类型的变量,包括String类型。boolean类型的直接量只能赋给boolean类型的变量,不能赋给其他任何类型的变量。