Java数据类型的基本概念
数据类型在计算机语言里面,是对内存位置的一个抽象表达方式,可以理解为针对内存的一种抽象的表达方式。
开始接触每种语言的时候,都会存在对数据类型的认识,有复杂的,有复杂的,各种数据类型都需要在学习初期去了解。数据类型是语言的抽象原子概念,可以说是语言中最基本的单元定义。
Java语言是一门强类型语言,所以Java对于数据类型的规范会相当严格。在Java里面,本质上将数据类型分为两种:基本数据类型和引用数据类型。
基本数据类型:基本数据类型又称为简单数据类型,是一些不能简化的、内置的数据类型,由编程语言本身定义,它表示了真实的数字、字符和整数。
引用数据类型:Java语言本身不支持C++中的结构(struct)或联合(union)数据类型,它的复合数据类型一般都是通过类或接口进行构造,类提供了捆绑数据和方法的方式,同时可以针对程序外部进行信息隐藏。
事实上,Java语言是一个近乎纯洁的面向对象编程的语言,只是为了编程的方便,才引入了基本数据类型。而为了能够将这些基本数据类型当作对象操作,Java又为每一个基本数据类型都引入了相应的包装类型,这些包装类型则是属于引用类型。
Java中的8个基本数据类型
byte(字节型):Java中最小的数据类型,在内存中占8位(bit),即1个字节,取值范围-128~127,默认值是0。
short(短整型):在内存中占16位,即2个字节,取值范围-32768~32717,默认值是0。
int(整型):用于存储整数,在内存中占32位,即4个字节,取值范围-2147483648~2147483647,默认值是0。
long(长整型):在内存中占64位,即8个字节,取值范围-2^63-2 ~2^63-1,默认值是0L。
float(浮点型):用于存储带有小数点的数字,在内存中占32位,即4个字节,默认值是0。
double(双精度浮点型):用于存储带有小数点的数字,在内存中占64位,即8个字节,默认值是0。
char(字符型):用于存储单个字符,在内存中占16位,即两个字节,取值范围0~65535,默认值是空(非null)。
boolean(布尔类型):用于判断真或假,仅有两个值,即true和false。在内存中占8位,即1个字节,默认值是false。
Java数据类型在内存中的存储
在Java中,每个存放数据的变量都是有类型的,比如说char ch;中ch是字符型的,就会分配到2个字节的内存。不同类型的变量在内存中分配的字节数不同,同时存储方式也是不同的。
所以给变量赋值前,需要先确定变量的类型,确定了变量的类型,即确定了数据需要分配的内存空间的大小,数据在内存中的存储方式。
基本数据类型的存储原理:所有简单数据类型不存在【引用】的概念,基本数据类型都是直接存储在内存中的内存栈上面的,数据本身的值就是存储在栈空间里面,而Java语言里面的8种基本数据就是这种存储模型。
引用类型的存储原理:引用类型继承于Object类(也是引用类型),都是按照Java里面存储对象的内存模型来进行数据存储的,使用Java内存堆和内存栈来进行这种类型的数据存储,简单来讲,【引用】是存储在有序的内存栈上的,而对象本身的值则存储在内存堆上。
区别:基本数据类型和引用类型的区别,主要在于基本数据类型是分配在栈上的,而引用类型是分配在堆上的(需要理解Java中的栈和堆的概念)
Java基本数据类型的取值范围计算
从计算机组成原理的角度可以解释:
byte在计算机中是占8位的,而且byte是有符号整型,用二进制表示时,最高位为符号位,0代表正数,1代表负数。
最大值是127,即2的7次方减1;最小值是-128,即2的7次方前面加个负号。(需要理解二进制)
正数在计算机中是以原码形式存在的;而负数在计算机中是以补码的形式存在的,就是负数的绝对值的原码转为二进制再按位取反后再加1。
以10和-10为例来介绍:
10的原码是00001010,即2^1+2^3,它在计算机中的存储就是00001010。
-10按照前面说的,需要先算出其绝对值是10,转为二进制,就是00001010,然后按位取反,得到11110101,然后再加1,即加上2的0次方,得到11110110,这个结果就是-10的补码,即在计算机中11110110代表的就是-10。