在通常情况下,一个Java整数常量默认是int类型。
两个注意点:
1、如果直接将一个较小的整数常量(在byte或者short类型范围内)赋给一个byte或short变量,系统会自动地把这个整数常量当成byte或short类型来处理;
2、如果使用一个较大的整数常量(超出了int类型的表示范围),Java不会把这个整数常量当成long类型来处理。如果希望系统把一个整数常量当成long类型来处理,应该在这个整数常量后面加上 “L” 或者 “l” 作为后缀。(一般建议用“L”,比较好区分)
例如
long a = 10L;
这里把第二点中第一句再解释一下:
我们可以把一个较小的整数常量(在int类型的表述范围内)直接赋值给一个long类型的变量,Java依然会把这个整数常量当成int类型来处理,只是这个int类型的值会完成自动类型转换,转换到long类型。
----------------------------------------------------------------------------------------------------------------------------------
A、变量的两种类型:
1、值类型:
它存储的是变量真正的数值,比如基础数据类型,值类型储存在内存的 栈 中。
2、引用类型:
它们储存的是对象的地址,而该地址所对应的内存空间存储的东西才是需要的内容,比如字符串和对象等,储存在内存的 堆 中。
B、对比一下数组的存储方式:
实际的数组元素被存储在堆内存中,数组引用变量是一个引用类型的变量,被存储在栈内存中。
如果感觉好像跟上面的语句矛盾,思维有点混乱的,看下面解说:
数组是一种引用数据类型,在它完成实例化的时候才是完全形态的,所以那时候它同引用类型一样,才会存储在堆中。
这种情况下,是存储在栈中,此时没有赋值;如果是
a=new int[5];//分配内存地址
这种情况,已经是new出来的对象了,初始化了一下,尽管默认值是0,那也是实际数组的元素了,所以是存储在堆中的。
--------------------------------------------------------------------------------------------------------------------
堆:
1、用于存储所有new出来的对象(包括成员变量)。
2、垃圾:没有任何引用所指向的对象
垃圾回收器(GC):不定时到内存中清扫垃圾。
回收过程是透明的,不一定一发现垃圾就立刻回收;调用System.out.gc( )可以建议JVM(Java虚拟机)快速调度GC来回收。
3、内存泄漏:不再使用的内存没有被及时回收。
建议对象不再使用时应及时将引用设置为null。
4、成员变量的生命周期:
创建对象时存储在堆中,对象被回收时一并被回收。
栈:
1、存储正在调用的方法中的所有局部变量(包括参数)。
调用方法中在栈中为该方法分配一块对应的栈帧,栈帧中存储方法中的所有局部变量(包括参数);方法执行结束时,栈帧被清除,局部变量一并被清除。
2、局部变量的生命周期:
调用方法中存在栈中,方法结束时与栈帧一并被清除。
--------------------------------------------------------------------------------------------------------------------
引用类型:
如果一个内存中的对象没有任何引用的话,就说明这个对象已经不再被使用了,从而可以称为被垃圾回收的候选。对于一个对象来说,只要有引用的存在,它就会一直存在于内存中。如果这样的对象越来越多,超出了JVM中的内存总数,JVM就会抛出OutOfMemory错误。可以人为地与垃圾回收器进行交互。
1、强引用:
例如“Data date=new Date( )”其中的date就是一个对象的强引用。很多情况下,会同时有多个引用指向同一个对象。强引用的存在限制了对象在内存中的存活时间。
2、软引用:
在强度上弱于强引用,通过类SoftReference来表示。它的作用是告诉垃圾回收器,程序中哪些对象不那么重要,当内存不足的时候是可以被暂时回收的。当JVM中的内存不足的时候,垃圾回收器会释放那些只被软引用所指向的对象。如果全部释放完这些对象之后,内存还不足,才会抛出OutOfMemory错误。软引用非常适用于创建缓存。当系统内存不足的时候,缓存中的内容是可以被释放的。
--------------------------------------------------------------------------------------------------------------------
方法区:
1、存储.class字节码文件(包括方法)
2、方法只有一份,通过this来区分具体的对象
--------------------------------------------------------------------------------------------------------------------
成员变量和局部变量的区别:
1、成员变量:
在类中但是在方法外,有默认值。创建对象存储在堆中,对象被回收时一并被回收。
2、局部变量:
在类中且在方法定义中或在方法声明上,无默认值。调用方法时存在栈中,方法执行结束与栈帧一并被清除。