Java笔记(二)常量的注意点、变量的两种类型、栈和堆的存储内容等

在通常情况下,一个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、对比一下数组的存储方式:

实际的数组元素被存储在堆内存中,数组引用变量是一个引用类型的变量,被存储在栈内存中。

如果感觉好像跟上面的语句矛盾,思维有点混乱的,看下面解说:

数组是一种引用数据类型,在它完成实例化的时候才是完全形态的,所以那时候它同引用类型一样,才会存储在堆中。

int[] a=null;//声明数组,也是引用

这种情况下,是存储在栈中,此时没有赋值;如果是

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、局部变量:

        在类中且在方法定义中或在方法声明上,无默认值。调用方法时存在栈中,方法执行结束与栈帧一并被清除。

猜你喜欢

转载自blog.csdn.net/Steriles_/article/details/80093582
今日推荐