java数据类型分两种:基本数据类型和引用数据类型
概念:
基本数据类型:简单数据类型是不能简化的、内置数据类型、由编程语言本身定义,它表示了真实的数字、字符和整数
引用数据类型:java语言本身不支持C++中的结构(struct)和联合(union)数据类型,它的复合数据类型一般都是通过类或接口进行构造,类提供了捆绑数据和方法的方式,同时针对程序外部进行信息隐藏
区别:
基本数据类型和引用数据类型的区别主要在于基本数据类型是分配在栈上的,而引用类型是分配在堆上的。(基本;类型和引用类型内存模型本质上是不一样的)
存储:
基本数据类型的存储原理:(直接存储在内存中的内存栈上)不存在“引用”的概念,数据本身的值就是存储在栈的空间里。
引用数据类型的存储原理:(“引用”是存储在有序的内存栈上的,而对象本身的值存储在内存堆上)引用类型继承于Object类(也是引用类型)都是按照java里面存储对象的内存模型来进行数据存储的,使用java内存堆和内存栈来进行这种类型的数据存储。
一、基本数据类型
byte:(字节型)内存中占8位(1个字节),是所有数据类型中最小的一个,取值在-128到127之间,默认为0
short:(短整型)内存中占16位(2个字节),取值范围-32768到32717,默认值为0
int:(整型)内存中占32位(4个字节),取值范围-2147483648到2147483647,默认值为0
long:(长整型)内存中占64位(8个字节),取值范围-2^63到2^63-1,默认值0L
float:(浮点型)内存中占32位(4个字节)用于存储带小数点的值(与double的区别在于float类型有效小数点只有6到7位),默认值为0
double:(双精度浮点型)在内存中占64位(8个字节),用于存储带有小数点的数字,默认值为0
char:(字符型)在内存中占16位(2个字节),取值范围0到65535,默认值为null(空)
boolean:(布尔类型)1个字节,取值为true\false(用于判断真和假),默认值为false
二、引用数据类型
类 class
接口 interface
数组 array
数据之间的自动转换(放大转换由小转大)
自动转换时发生扩宽(widening conversion)。因为较大的类型(如int)要保存较小的类型(如byte),内存总是足够的,不需要强制转换。如果将字面值保存到byte、short、char、long的时候,也会自动进行类型转换。注意区别,此时从int(没有带L的整型字面值为int)到byte/short/char也是自动完成的,虽然它们都比int小。在自动类型转化中,除了以下几种情况可能会导致精度损失以外,其他的转换都不能出现精度损失。
》int--> float
》long--> float
》long--> double
》float -->double without strictfp
强制转换
如果要把大的转成小的,或者在short与char之间进行转换,就必须强制转换,也被称作缩小转换(narrowing conversion),因为必须显式地使数值更小以适应目标类型。强制转换采用转换操作符()。严格地说,将byte转为char不属于narrowing conversion),因为从byte到char的过程其实是byte-->int-->char,所以widening和narrowing都有。强制转换除了可能的精度损失外,还可能使模(overall magnitude)发生变化。强制转换格式如下:
(target-type) value
在变量前加上括号,在括号中指定要强制转换的类型
例:
double a =88.8;
int b= (int)a;
注:强制转换会损失数值精度,例如double类型变量a,经强制转换为int类型后值变为88