Java是强类型语言,即每个变量和对象都必须具有声明类型。
由于不同数据存储时所需的空间大小各不相同,故对不同数据采用不同的数据类型来进行区分。
数据类型结构图:
一、数据类型
1.基本数据类型
基本数据类型在声明变量后会立刻分配数据的内存空间,在其中存储的是数据值,数据占用的内存空间大小是固定的,与软硬件环境无关,这两点保证了java的跨平台性和安全性。
基本数据类型存储需求和表示范围:
注意:
①java中不允许使用未初始化的变量
②boolean类型的取值只能是ture或false,不能与其他类型进行转换
③char占两个字节是因为java采用unicode编码而不是ASCII编码
④在计算机中都以二进制的补码形式存储
2.引用数据类型
引用数据类型在声明变量时不会分配数据的内存空间,只会分配一个空间用来存储数据的内存地址。Java中,引用类型指向一个对象,指向对象的变量是引用变量。
注意:
①引用类型的变量在java栈中存储对数据的引用地址,而数据存储在java堆中。
②这些变量在声明时被指定为一个特定的类型,变量一旦声明后,类型就不能被改变了。
③所有引用类型默认值都为null。
二、装箱机制、拆箱机制
java数据类型中的8中简单类型分别为:boolean、byte、char、short、int、long、float、double。与之相对应,java类库java.lang包中定义了8种包装类:Boolean、Byte、Character、Short、Integer、Long、Float、Double。
1.装箱
装箱:把基本类型用它们相应的引用类型包装起来,使其具有对象的性质。
如:Integer a=10; <隐式加包> 将基本数据类型10加包为Integer类型
Integer.valueOf(10)<显式加包>
2.拆箱
拆箱:将引用类型的对象简化成值类型的数据
如:Int b=a;<隐式拆包> 将Integer类型a拆包为int型10
int b=a.intValue();<显式拆包>
注:装 / 拆箱操作会导致额外的系统开销。
例:
public class TestBoxing{
public static void main(String[] args) {
int i=123;
Integer obj1=i; //隐式装箱 int i->Integer obj1
Integer obj2=Integer.valueOf(i); //显式装箱
int j=obj1; //隐式拆箱 Integer类型的obj1->int j
int k=obj2.intValue(); //显式拆箱
System.out.println("The value-type value(j)="+j);
System.out.println("The value-type value(k)="+k);
System.out.println("The object-type value(obj1)="+obj1.toString());
System.out.println("The object-type value(obj2)="+obj2.toString());
}
}
运行结果:
三、类型转换
1.自动类型转换:只允许发生从低精度到高精度的类型转换,转换后的数值大小不受影响。
例:
short s=10;
int n=s; //类型提升为int
<将short类型变量s赋值给int类型n,由于int类型的取值范围大于short类型的取值范围,在赋值过程中不会造成数据丢失,故编译器自动完成类型转换。>
不同数据类型间的转换规则:
2.强制类型转换:一般使用强转操作符 ( ) 进行转换。
例:
double x=3.14;
int n=(int)x
结果为:x=3.14,n=3
注意:
①若把大类型的数据存到小类型的变量当中势必会发生数据截断、精度降低的现象。
②java中的数据类型从byte转成char需要:byte->int->char
③无论从short类型转成char类型还是char类型转成short类型都必须强制转换。
在java中只有char类型是无符号整型,其余都是有符号类型。由此可知short和char类型变量,虽然他们所占字节数相同,但是他们之间表示的范围却不同,char类型保存16位整数,而short类型保存的是15位整数。