1.每种类型的声明方式、占多少字节、取值范围
/** 提示: 1个字节=8个二进制数空间,8个二进制数的首位(符号位)是判断是否为正数,0为正数,1为负数,其他七位数是存储。*/
//整数型
byte a = 0; /** byte类型占1个字节,取值范围为 -128到127的范围, 默认值为0 */
short b = 0; /** short类型占2个字节,取值范围为-2^15到正的( 2^15)-1.默认值为0 */
int c = 0; /** int类型占4个字节,取值范围为-2^31到2^31-1, 默认值为0 */
long d = 0L; /** long类型占8个字节,取值范围为-2^63到2^63-1, 默认值为0L */
//浮点型
float e = 0.0f; /** float类型占4个字节,Java中最多显示7位小数,默认值为0.0f */
double f = 0.0d; /** double类型占8个字节,Java中最多显示15位小数,默认值为0.0d。*/
//字符型
char g = ' '; /** char类型占2个字节。默认值为null(空的对象,不是没有)*/
//布尔型
boolean h = false;
/** 1.单个的boolean 类型变量在编译的时候是使用的int 类型。
boolean a=true;//这个a在JVM中占4个字节即:32位。
2.boolean 类型的数组时,在编译的时候是作为byte array来编译的所以boolean 数组里面的每一个元件占一个字节,
boolean[] b = new boolean[10];//数组时,每一个boolean在JVM中占一个字节。*/
2. 相互转化
类型转换路线:byte->short->int->long->float->double
char->int;int->char;-------boolean类型不能转化。
取值范围小的可以自动转化为大的,取值范围大的转换成小的需要强制转化,而且可以会存在数据溢出或精度下降,例如:
3.基本类型的存放位置
要看基本类型的存放位置,主要看基本类型是在哪里声明的。
- 在内部方法中时,存放的位置是在栈中。
void method(){
int a = 3;
}
- 在类中的定义时,是随着类存放在堆中的
class Test {
int a = 1;
}
理解:堆 是所有线程共享的内存区域,栈 是每个线程独享的,如果将一个类的实例变量放在栈内,那么就不存在多个线程访问同一个对象资源了,这显然是不对的,所以实例变量要在堆上创建,也不是线程安全的。
但是对于局部变量,是在栈上创建的,每一次方法调用创建一个帧,独享一份内存区域,其他的线程是不会访问到该线程的资源,在 栈上创建也会减轻GC的压力,随着该方法的结束,帧出栈,相对应的内存消除,这种局部变量占用的内存自然就消失了,因此局部变量是线程安全的。
思考:基本类型如上,那引用类型呢?