Java中的基本数据类型
Java中的数据类型可以分为两种:
基本数据类型
整型 byte short int long
浮点型 float double
字符型 char
布尔型 boolean
引用数据类型
可以说,除了基本类型以外的所有类型都是引用数据类型
主要包括类,接口,数组等
如下图所示
基本数据类型在内存中的分配
基本型别 | 大小 | 最小值 | 最大值 |
boolean | ----- | ----- | ------ |
char | 16-bit | Unicode 0 | Unicode 2^16-1 |
byte | 8-bit | -128 | +127 |
short | 16-bit | -2^15 | +2^15-1 |
int | 32-bit | -2^31 | +2^31-1 |
long | 64-bit | -2^63 | +2^63-1 |
float | 32-bit | IEEE754 | IEEE754 |
double | 64-bit | IEEE754 | IEEE754 |
注意!:表格里的^代表的是次方
基本数据类型的转换
有两种方式:自动转换和强制转换,通常发生在表达式中或方法的参数传递时。
1 自动转换
具体地讲,当一个较“小”数据与一个较“大”的数据一起运算时,系统将自动将“小”数据转换成“大”数据,再进行运算。而在方法调用时,实际参数较“小”,而被调用的方法的形式参数数据又较“大”时(若有匹配的,当然会直接调用匹配的方法),系统也将自动将“小”数据转换成“大”数据,再进行方法的调用,自然,对于多个同名的重载方法,会转换成最“接近”的“大”数据并进行调用。这些类型由“小”到“大”分别为 (byte,short,char)--int--long--float—double。这里我们所说的“大”与“小”,并不是指占用字节的多少,而是指表示值的范围的大小。
例如
byte b=10;
int i=b;(将byte数据向int赋值时,完成了自动转换)
char c=’A’;
int i=c;(这时会将’A’ 对应的ASCII码值赋值给i)
2 强制转换
将“大”数据转换为“小”数据时,你可以使用强制类型转换。
例如:
int n=(int)1.23456;
输出结果为 1
可以想象,这种转换肯定可能会导致溢出或精度的下降。
注意
当字节类型变量参与运算,java作自动数据运算类型的提升,将其转换为int类型。
byte b=3;
b=(byte)(b*3);//必须声明byte。
带小数的变量默认为double类型。
float f=1.3f;//必须声明f。
基本数据类型的存储
诸如int a = 3; long b = 255L;的形式来定义的,称为自动变量。值得注意的是:自动变量存的是字面值,不是类的实例,即不是类的引用,这里并没有类的存在。如int a = 3;这里的a是一个指向int类型的引用,指向3这个字面值。这些字面值的数据,由于大小可知,生存期可知(这些字面值固定定义在某个程序块里面,程序块退出后,字段值就消失了),出于追求速度的原因,就存在于栈中。
另外,栈有一个很重要的特殊性,就是存在栈中的数据可以共享。 假设我们同时定义:
int a = 3; int b=3; 编译器先处理int a = 3;首先它会在栈中创建一个变量为a的引用,然后查找有没有字面值为3的地址,没找到,就开辟一个存放3这个字面值的地址,然后将a指向3的地址。接着处理int b = 3;在创建完b这个引用变量后,由于在栈中已经有3这个字面值,便将b直接指向3的地址。这样,就出现了a与b同时均指向3的情况。 定义完a与b的值后,再令a = 4;那么,b不会等于4,还是等于3。在编译器内部,遇到时,它就会重新搜索栈中是否有4的字面值,如果没有,重新开辟地址存放4的值;如果已经有了,则直接将a指向这个地址。因此a值的改变不会影响到b的值。