数据类型一般指数据元。数据元( Data Element),也称为数据元素,是用一组属性描述其定义、标识、表示和允许值的数据单元,在一定语境下,通常用于构建一个语义正确、独立且无歧义的特定概念语义的信息单元。数据元可以理解为数据的基本单元,将若干具有相关性的数据元按一定的次序组成一个整体结构即为数据模型。
Java语言提供了八种基本数据类型。六种数字类型(四个整数型,两个浮点型),一种字符类型,还有一种布尔型。
数据类型 | 二进制位数 | 最小值 | 最大值 | 默认值 | 描述 |
---|---|---|---|---|---|
byte | 8 | -128 -2^7 |
127 2^7 - 1 |
0 | 1. byte 数据类型是以二进制补码表示的整数 2. 有符号 3. 用在大型数组中节约空间 4. byte 变量占用的空间只有 int 变量的四分之一 |
short | 16 | -32768 -2^15 |
32767 2^15 - 1 |
0 | 1. short 数据类型是以二进制补码表示的整数 2. 有符号 3. short 变量占用的空间只有 int 变量的二分之一 |
int | 32 | -2,147,483,648 -2^31 |
2,147,483,647 2^31 - 1 |
0 | 1. int 数据类型是以二进制补码表示的整数 2. 有符号 3. 一般地,整型变量默认为 int 类型 |
long | 64 | -9,223,372,036,854,775,808-2^63 |
9,223,372,036,854,775,8072^63 - 1 |
0L | 1. long 数据类型是以二进制补码表示的整数 2. 有符号 3. 它主要使用在需要比较大整数的系统上 |
float | 32 | ≈ 1.4E-45 | ≈ 3.4E38 | 00.0F | 1. float 数据类型是单精度 2. 符合IEEE 754标准的浮点数 3. 有符号 4. 在储存大型浮点数组的时候可节省内存空间 5. 它不能用来表示精确的值,如货币 |
double | 64 | ≈ 4.9E-324 | ≈ 1.8E308 | 0.0D | 1. double 数据类型是双精度 2. 符合IEEE 754标准的浮点数 3. 有符号 4. 一般地,浮点型变量默认为 double 类型 5. double类型同样不能表示精确的值,如货币 |
char | 16 | \u0000 0 |
\uffff 65,535 |
‘u0000’ | 1. char类型是一个单一的 16 位 Unicode 字符 2. char 数据类型可以储存任何字符 |
boolean | 1 | false | 1. 这种类型只作为一种标志来记录 true/false 情况 2. 只有两个取值:true 和 false; |
注:Float和Double的最小值和最大值都是以科学记数法的形式输出的,结尾的"E+数字"表示E之前的数字要乘以10的多少次方。比如 1.4E-45 就是 1.4 × 10 ^ -45
public class DataElement {
public static void main(String[] args) {
// 声明一个 int 类型的名称为 a 的变量, 同时赋予其初始值为 10
int a = 10;
System.out.println("a = " + a);
// 声明两个 int 类型的变量, 名称分别为 b 和 c, 同时分别赋予其初始值为 20 和 30
int b = 20, c = 30;
System.out.println("b = " + b);
System.out.println("c = " + c);
// 声明一个 int 类型的变量 d
int d;
// 声明两个 int 类型的变量, 名称分别为 e 和 f
int e, f;
// 为变量 d 赋予值为 40
d = 40;
// 为变量 e 赋予值为 50
e = 50;
// 为变量 f 赋予值为 60
f = 60;
System.out.println("d = " + d);
System.out.println("e = " + e);
System.out.println("f = " + f);
}
}
注:这里使用到了一个运算符 +
在下一篇文章中将会详细阐述 Java 的运算符
该源程序中我们知道了如何使用 int 关键字声明 int 类型的变量。但需要注意的是:代码块中,关键字 int 声明的变量在未赋予初始值的时候,是不允许被读取的。这条规则同样适用于其他的七种基本数据类型。但是,如果声明的变量是类成员的话,系统会自动将默认值作为它的初始值,不同的基本数据类型的默认值参考上表所示。关于声明类成员变量的内容将会在后面的文章中详细阐述。上例中的变量 d, e, f 均未设置初始值。若在为变量 d 赋予值之前使用打印函数将其值打印到控制台,会出现一个异常提示 —— 错误: 可能尚未初始化变量d
上述程序中将得到如下结果:
a = 10
b = 20
c = 30
d = 40
e = 50
f = 60
对于 byte, short, long, float 和 double 这些类型的变量声明方式和上述源程序中的 int 类型的声明方式一样。但是需要注意几个问题:
关于 char 类型的变量的声明和字符串类似,不过需要使用单引号,而且,引号内只能存在一个字符。例如:
char c1 = 'A';
char c2 = '您';
关于 boolean 类型的变量,因为其类型的取值范围只有两个值,声明和赋值就更简单了。例如:
boolean b1 = true;
boolean b2 = false;
从上表中我们知道,每个基本数据类型有自己的取值范围,那如果超出这个范围会出现什么结果?
byte b = 128;
我们使用 javac 编译该源程序的时候,发现控制台提示 —— 错误: 不兼容的类型: 从int转换到byte可能会有损失,从这个错误提示中我们知道三个信息:
从上表中可以知道的整型(整数类型)变量默认是 int 类型,这也是 Java 语言的规则。所以源程序中的字面量 128 被视作 int 类型。但是,这段代码中我们需要声明的是 byte 类型,故而,编译器会自动进行数据转换工作,将 int 类型的字面量 128 转换为 byte 类型的数据并赋值给变量 b。这个过程由编译器自动完成。
一般地,不需要使用代码加以声明就进行数据类型转换的过程称之为 隐式转换,也称 自动类型转换。
但是,byte 类型的取值范围是在 [-128, 127] 区间内。所以,转换的结果是变量 b 无法接受该值。于是就在编译过程中会提示异常信息。
虽然整型字面量被认为是 int 类型,但是 int 类型也有它的取值范围,那如果超出了这个范围,会有什么结果呢?
int number = 2147483648;
使用 javac 编译的时候,发现控制台提示 —— 错误: 过大的整数: 2147483648,但是当我们将这个字面量修改为 2147483647 的时候,编译器通过了。这说明我们在使用某个数据类型的之前,首先需要注意的问题就是它的取值范围。
我们在使用 long, float 和 double 类型的时候,需要在字面量后增加一个字母,例如
long l = 1000L;
float f = 3.14F;
double d = 2.7183D;
字段代码中的三个字面量跟之前不同之处在于,字面量 1000L
被认为 long 类型而不是 int 类型,没有发生隐式转换,同样的,字面量 3.14F
被认为是 float 类型,字面量 2.7183D
被认为是 double 类型。这些单字母与数字成为一个不可分割的整体,不是单纯地在数字后增加一个字母而已。另外,如果字面量是一个浮点型,编译器默认认为是 double ,故而,double 类型的变量后面的字母D可以省略。
我们可以做个实验:
float f = 3.14;
使用 javac 编译的时候,发现控制台提示 —— 错误: 不兼容的类型: 从double转换到float可能会有损失,这个提示跟之前的 int 转 byte 的提示很相似。在实际运用中,我们如果需要使用 float 类型,请切记在字面量后加字母 F
一般地,使用代码加以声明对数据类型进行转换的过程称之为显示转换,也称强制类型转换。但是在转换的过程中,可能会丢失精度。例如:
float f = (float)3.14;
int i = (int)5.78;
在这段代码中,字面量 3.14 被认为是 double 类型,使用显示转换后,得到了一个 float 类型的变量,值为 3.14。字面量 5.78 被认为是 double 类型,使用显示转换后,得到了一个 int 类型的变量,值为 5。
在进行显示转换过程中,我们一般面临两种类型转换:
一般地,向下转型可能丢失精度,向上转型不会丢失精度。本例中,将 double 转换为 int 就发生了精度的丢失。
为了更好地组织类,Java 提供了包机制,类似 C++ 语言中的命名空间的概念,其目的是为了将功能相同或者相似的类放置到同一个地方,方便归档。在后面的文章中将详细的说明 java 中的包的概念。
在 Java 源程序中,我们使用的 System 类正是在 java.lang 包中,而在此包中的类是不需要引用就能直接被使用的,比如之前使用的 System
。所以的源程序中 System.out.println
代码可以调整为:
// System`s qualified name is : java.lang.System
java.lang.System.out.println("Hello World!");
一个类的包名和类名合称该类的完全限定名,即 Fully Qualified Name,故而,System 类的完全限定名是 java.lang.System
Java 是一门面向对象的编程语言,这八种基本数据 类型都有对应的类。参考下表所示:
基本数据类型 | 对应类的完全限定名 |
---|---|
byte | java.lang.Byte |
short | java.lang.Short |
int | java.lang.Integer |
long | java.lang.Long |
float | java.lang.Float |
double | java.lang.Double |
char | java.lang.Character |
boolean | java.lang.Boolean |
我们可以通过类来获取到二进制位数,最大值和最小值等信息。例如:
public class DataElement {
public static void main(String[] args) {
// byte
System.out.println("基本类型:byte 二进制位数:" + Byte.SIZE);
System.out.println("最小值:Byte.MIN_VALUE=" + Byte.MIN_VALUE);
System.out.println("最大值:Byte.MAX_VALUE=" + Byte.MAX_VALUE);
System.out.println();
// short
System.out.println("基本类型:short 二进制位数:" + Short.SIZE);
System.out.println("最小值:Short.MIN_VALUE=" + Short.MIN_VALUE);
System.out.println("最大值:Short.MAX_VALUE=" + Short.MAX_VALUE);
System.out.println();
// int
System.out.println("基本类型:int 二进制位数:" + Integer.SIZE);
System.out.println("最小值:Integer.MIN_VALUE=" + Integer.MIN_VALUE);
System.out.println("最大值:Integer.MAX_VALUE=" + Integer.MAX_VALUE);
System.out.println();
// long
System.out.println("基本类型:long 二进制位数:" + Long.SIZE);
System.out.println("最小值:Long.MIN_VALUE=" + Long.MIN_VALUE);
System.out.println("最大值:Long.MAX_VALUE=" + Long.MAX_VALUE);
System.out.println();
// float
System.out.println("基本类型:float 二进制位数:" + Float.SIZE);
System.out.println("最小值:Float.MIN_VALUE=" + Float.MIN_VALUE);
System.out.println("最大值:Float.MAX_VALUE=" + Float.MAX_VALUE);
System.out.println();
// double
System.out.println("基本类型:double 二进制位数:" + Double.SIZE);
System.out.println("最小值:Double.MIN_VALUE=" + Double.MIN_VALUE);
System.out.println("最大值:Double.MAX_VALUE=" + Double.MAX_VALUE);
System.out.println();
// char
System.out.println("基本类型:char 二进制位数:" + Character.SIZE);
// System.out.println("最小值:Character.MIN_VALUE=" + Character.MIN_VALUE);
// System.out.println("最大值:Character.MAX_VALUE=" + Character.MAX_VALUE);
// 使用显示转换,查看最小的 char 值对应的 int 值
System.out.println("最小值:Character.MIN_VALUE=" + (int) Character.MIN_VALUE);
// 使用显示转换,查看最大的 char 值对应的 int 值
System.out.println("最大值:Character.MAX_VALUE=" + (int) Character.MAX_VALUE);
}
}
编译并执行的结果是:
基本类型:byte 二进制位数:8
最小值:Byte.MIN_VALUE=-128
最大值:Byte.MAX_VALUE=127
基本类型:short 二进制位数:16
最小值:Short.MIN_VALUE=-32768
最大值:Short.MAX_VALUE=32767
基本类型:int 二进制位数:32
最小值:Integer.MIN_VALUE=-2147483648
最大值:Integer.MAX_VALUE=2147483647
基本类型:long 二进制位数:64
最小值:Long.MIN_VALUE=-9223372036854775808
最大值:Long.MAX_VALUE=9223372036854775807
基本类型:float 二进制位数:32
最小值:Float.MIN_VALUE=1.4E-45
最大值:Float.MAX_VALUE=3.4028235E38
基本类型:double 二进制位数:64
最小值:Double.MIN_VALUE=4.9E-324
最大值:Double.MAX_VALUE=1.7976931348623157E308
基本类型:char 二进制位数:16
最小值:Character.MIN_VALUE=0
最大值:Character.MAX_VALUE=65535