- 基本数据类型
- 整数类型
- 浮点类型
- 字符型
- 布尔型
- 引用数据类型
- 隐式转换(自动类型转换)
- 显式转换(强制类型转换)
Java是强类型(Strongly Typed)语言,强类型包含以下两方面的含义:
- 所有的变量必须先声明、后使用
- 指定类型的变量只能接受类型与之匹配的值。
所以Java不存在无类型的变量。
类型 | 关键字 | 占用内存 | 取值范围 |
---|---|---|---|
字节型 | byte | 1 字节 | -128 ∼ \sim ∼ 127 |
短整形 | short | 2 字节 | -32768 ∼ \sim ∼ 32767 |
整型 | int | 4 字节 | -2147483648 ∼ \sim ∼ 2147483647 |
长整型 | long | 8 字节 | -9223372036854775808L ∼ \sim ∼ 9223372036854775807L |
单精度浮点型 | float | 4 字节 | +/-3.4E+38F(6~7 个有效位) |
双精度浮点型 | double | 8 字节 | +/-1.8E+308 (15 个有效位) |
字符型 | char | 2 字节 | ISO 单一字符集 |
布尔型 | boolean | 1 字节 | true 或 false |
实际上字符型也是一种整数类型,相当于无符号整数类型。
所有的基本数据类型所占用的字节数都已明确规定,在各种不同的平台上保持不变。
Java的4种整数类型都是有符号整数。
类型 | 说明 |
---|---|
byte | byte 类型是最小的整数类型。当用户从网络或文件中处理数据流时,或者处理可能与 Java 的其他内置类型不直接兼容的未加工的二进制数据时,该类型非常有用。 |
short | short 类型限制数据的存储为先高字节,后低字节,这样在某些机器中会出错,因此该类型很少被使用 |
int | int 类型是最常使用的一种整数类型 |
long | 对于大型程序常会遇到很大的整数,当超出 int 类型所表示的范围时就要使用 long 类型 |
计算机的数值应视为连续若干个二进制位的集合,而所谓高、低字节就是此集合中位地址高/低的二进制位集合。
例如定义一个unsigned short
变量在0x1234 5678
,那么这个变量的地址就是0x1234 5678
,占用0x1234 5678
与0x1234 5679
两字节存储空间,其中0x1234 5678
是低字节、0x1234 5679
是高字节。
一个16进制数有两个字节组成,例如:A9。
高字节就是指16进制数的前8位(权重高的8位),如上例中的A。
低字节就是指16进制数的后8位(权重低的8位),如上例中的9。
创建一个Java程序,在main()
方法中声明这4种类型的变量:
public static void main(String[] args) {
byte a = 1;
short b = 10;
int c = 100;
long d = 1000;
}
byte
、short
、int
和 long
都是整数类型,故可以使用“+”相加,而非字符串之间的连接。
浮点类型是带有小数部分的数据类型,也叫实型。
Java 默认的浮点型为 double
。
例如,11.11
是 double
型数值。
如果要说明一个 float
类型数值,就需要在其后追加字母 f 或 F,如 11.11f
是 float
类型的常数。
不过对 double
值来说,d(或 D)是否作后缀是可选的。
创建一个Java程序,在main()
方法中声明这2种类型的变量:
public static void main(String[] args) {
float a = 1.1f;
double b = 2.3;
int num = 2;
float c = (float)(b * num);
}
一个 double
类型的数据与一个 int
类型的数据相乘后得到的结果类型为 double
,但是由于b * num
为一个单精度浮点型(float
类型)的数,因此可以将b * num
转换为 float 类型的数据。
Java 语言中的char
类型使用两个字节的 Unicode 编码表示,它支持世界上所有语言,可以使用单引号字符或者整数对 char
型赋值。
一般计算机语言使用 ASCII 编码,用一个字节表示一个字符。
ASCII 码是 Unicode 码的一个子集,用 Unicode 表示 ASCII 码时,其高字节为 0,它是其前 255 个字符。
Unicode 字符通常用十六进制表示。
例如“\u0000”~“\u00ff”表示 ASCII 码集。
(“\u”表示转义字符,它用来表示其后 4 个十六进制数字是 Unicode 码)
创建一个Java程序,在main()
方法中声明这种类型的变量:
public static void main(String[] args) {
char a = 'A';
char b = 'B';
System.out.println("A 的 ASCII 值与 B 的 ASCII 值相加结果为:"+(a+b));
}
运行结果为:
A 的 ASCII 值与 B 的 ASCII 值相加结果为:131
字母 A 在 ASCII(和 Unicode)中对应的值为 65,字母 B 在 ASCII(和 Unicode)中所对应的值为 66,因此相加后得出的结果为 131。
一个 boolean
类型的变量或表达式只能是取 true
和 false
这两个值中的一个。
在 Java 语言中,布尔类型的值不能转换成任何数据类型,true
常量不等于 1,而 false
常量也不等于 0。
这两个值只能赋给声明为 boolean
类型的变量,或者用于布尔运算表达式中。
创建一个Java程序,在main()
方法中声明这种类型的变量:
public static void main(String[] args) {
boolean a = false;
}
引用数据类型
引用数据类型建立在基本数据类型的基础上,包括数组、类和接口。
引用数据类型是由用户自定义,用来限制其他数据的类型。
Java 语言中不支持C++中的指针类型、结构类型、联合类型和枚举类型。
所谓引用数据类型就是对一个对象的引用,对象包括实例和数组两种。
实际上,引用类型变量就是一个指针。
空类型(null type)就是 null 值的类型,这种类型没有名称。
因为 null 类型没有名称,所以不可能声明一个 null 类型的变量或者转换到 null 类型。
空引用(null)是 null 类型变量唯一的值。
空引用(null)可以转换为任何引用类型。
在实际开发中,程序员可以忽略 null 类型,假定 null 只是引用类型的一个特殊直接量。
Remark:
空引用(null)只能被转换成引用类型,不能转换成基本类型,因此不要把一个 null 值赋给基本数据类型的变量。
数据类型的转换是在所赋值的数值类型和被变量接收的数据类型不一致时发生的,它可以分为隐式转换(自动类型转换)和显式转换(强制类型转换)两种。
将一种类型的数据赋给另外一种类型变量的时,如果执行自动类型转换(automatic type conversion),需要同时满足以下两个条件:
- 两种数据类型彼此兼容。
如:
double
类型兼容int
类型,但是char
型不能兼容int
型 - 目标类型的取值范围大于源数据类型(低级类型数据转换成高级类型数据)。
如:
double
类型长度为8字节,int
类型为4字节,因此double
类型的变量里直接可以存放int
类型的数据,但反过来就不可以了。
这种转换称为拓宽转换(widening conversion)。
在运算过程中,由于不同的数据类型会转换成同一种数据类型,所以整型、浮点型以及字符型都可以参与混合运算。
自动转换的规则是从低级类型数据转换成高级类型数据。
转换规则如下:
- 数值型数据的转换:
byte
→short
→int
→long
→float
→double
- 字符型转换为整型:
char
→int
最终转换成表达式中表示范围最大的变量的数据类型。
创建一个Java程序,在main()
方法中进行混合运算:
public static void main(String[] args) {
float a = 1.18f;
double b = 2.2;
int num = 6;
double sum = a * num + b * num;
System.out.println(sum);
}
运行结果为:
20.279999923706058
显式转换(强制类型转换)Remark:
char
类型比较特殊,char
自动转换成int
、long
、float
和double
,但byte
和short
不能自动转换为char
,而且char
也不能自动转换为byte
或short
。
当两种数据类型不兼容,或目标类型的取值范围小于源类型时,自动转换将无法进行,这时就需要进行强制类型转换。
这种转换称为缩小转换(narrowing conversion)。
转换的语法格式为:
(typeConvertingTo)variableName
创建一个Java程序,在main()
方法中进行显示转换:
public static void main(String[] args) {
int a = 2;
double b = 3.1;
a = (int)b;
System.out.println(a);
int c = 2;
double d = 3.1;
d = (double)c;
System.out.println(d);
}
运行结果为:
3
2.0
所以,在强制类型转换中,如果是将浮点类型的值转换为整数,直接截去小数点后边的所有数字;而如果是整数类型强制转换为浮点类型时,将在小数点后面补零。
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)