1.概述
佛说,大千世界,无奇不有。在这个世界里,物种的多样性,遍地开花,同样,在Java的世界里,也有着异曲同工之妙,Java秉承面向对象的特性,必然少不了区分对象的类型,就像下图的“CuteCat”,它描述着在现实世界中存在的事物,同时也是今天我们要说的Java数据类型。
Java中的数据类型可划分为两种:
1)基本数据类型
基本数据类型是Java语言中数据操作的基础,包括
byte
、short
、int
、long
、float
、double
、char
、boolean
。
2)引用数据类型
引用数据类型包括类(class)、接口(interface)、数组。
如果只看文字描述的话,可能没有那么直观,上图自己体会。
那么首先来看看基本数据类型,不同的数据类型有着不同的默认值以及取值范围,既然取值范围不同,其所占用的内存空间也是不同的。来看下表:
数据类型 | 默认值 | 取值范围 | 内存占用 |
---|---|---|---|
byte | 0 | -128127(-2^72^7-1) | 1字节(8位) |
short | 0 | -3276832767(-2^152^15-1) | 2字节(16位) |
int | 0 | -2,147,483,6482,147,483,647(-2^312^31-1) | 4字节(32位) |
long | 0L | -263~263-1 | 8字节(64位) |
float(单精度) | 0.0f | 1.4E-45~3.4028235E+38 | 4字节(32位) |
double(双精度) | 0.0d | 4.9E-324~1.7976931348623157E+308 | 8字节(64位) |
char | ‘\u0000’ | ‘\u0000’(十进制0)~‘\uFFFF’(十进制65535) | 2字节(16位) |
boolean | false | true、false | 1字节(8位) |
2.基本数据类型
通过上面的介绍,相信大家对基本数据类型已经有一个大致的了解,接下来继续详细说明。
2.1 byte
byte类型属于整型,最小值为-128,最大值为127,默认值为0,内存占用为1字节。在编写程序时,如果可以确定变量的取值范围,为了节省空间,可以使用byte来存储数据。代码示例:
byte b1 = -128;
byte b2 = 127;
2.2 short
short类型属于整型,最小值为-32768,最大值为32767,默认值为0,内存占用为2字节。代码示例:
short s1 = -32768;
short s2 = 32767;
2.3 int
int类型属于整型,最小值为-2,147,483,648,最大值为2,147,483,647,默认值为0,内存占用为4字节。代码示例:
int i1 = -2,147,483,648;
int i2 = 2,147,483,647;
2.4 long
long类型属于整型,最小值为-9,223,372,036,854,775,808,最大值为-9,223,372,036,854,775,807,默认值为0,内存占用为8字节。代码示例:
long l1 = -9,223,372,036,854,775,808;
long l2 = 9,223,372,036,854,775,807;
2.5 float
float类型属于单精度浮点型,小数点有效位数为7位,最小值为1.4E-45,最大值为3.4028235E+38,默认值为0.0f,内存占用为4字节。示例代码:
float f = 1.1f;
2.6 double
double类型属于双精度浮点型,小数点的有效位数为16位,最小值为4.9E-324,最大值为1.7976931348623157E+308,默认值为0.0,内存占用为8字节。
double d = 1.1;
2.7 char
char类型可以表示一个16位的Unicode字符,最大值为’\uFFFF’(十进制65535),最小值为’\u0000’(十进制0),内存占用为2字节。代码示例:
char c = 'A';
**Tips:**编码类型不同,一个字符所在的内存空间也就不同。
-
ASCII编码:一个英文字符占一个字节,一个中文字符占两个字节。
-
Unicode编码:一个英文字符和一个中文字符占都两个字节。
-
utf8编码:一个英文字符占一个字节,一个中文字符占三个字节。
2.8 boolean
boolean类型的值分别为true、false,通常用于条件判断。代码示例:
boolean flag = true;
3.基本数据类型转换
3.1 为什么需要类型转换
类型转换?为什么Java基本数据类型之间会涉及到类型转换呢?
试想一下在现实世界中,如果将一个苹果和一个梨拿来比较,由于苹果和梨是两个不同的类型,自然是无法进行比较的。同理,Java是强类型语言,所以要求在执行赋值运算和算术运算的时候,参与运算的数据类型必须保持一致。
3.2 哪些基本数据类型可以相互转换
除了boolean类型,其余的数据类型在内存中存储的都是数值,因此,除了Boolean类型,其余的数据类型之间都可以相互转换。
3.3 类型转换方式
- 隐式类型转换
取值范围小的数据类型向取值范围大的数据类型转换时,可以自动转换,也叫隐式类型转换,有种大鱼吃小鱼的感觉。示例代码:
byte b =127;
short s = b;
int i = s;
long l = i;
float f = l;
double d = f;
如果是进行算数运算,也会进行类型自定转换:
1、如果其中一个数是double类型,其余的数也会转换为double类型。
2、如果其中一个数是float类型,其余的数也会转换为float类型。
3、如果其中一个数是long类型,其余的数也会转换为long类型。
我们再来看看这几种基本类型之间的隐式转换关系,实线表示无精度丢失,虚线表示可能会出现精度丢失。比如1234567890是一个10位的int类型的整数,它包含的位数比float类型所能够表达的位数多,在进行转换时就会出现精度丢失。
- 强制类型转换
取值范围大的数据类型向取值范围小的数据类型转换时,无法进行自动转换,需要我们为其指定显式的类型转换。进行强制类型转换容易造成数据异常,就像小鱼吃大鱼一样,如果硬把大鱼塞给小鱼吃,那必然是对小鱼的巨大破坏。代码示例:
long l = 9223372036854775807L;
int i = (int) l;// i的值为-1。
**Tips:**整型之间的隐式转换不会出现精度的丢失,整型和浮点型之间的类型转换可能会出现精度丢失。