简述Java中的栈和堆,变量和对象的地址存放和绑定机制

简述Java中的栈和堆,变量和对象的地址存放和绑定机制

初学java的小白,很多人都搞不清楚java中堆和栈的概念,我们都知道计算机只能识别二进制字节码文件,如果分不清楚对象和变量在内存的地址分配,也就是堆和栈的问题,很多问题比如绑定机制、静态方法、实例方法、局部变量的作用域就会搞不清楚。

首先记住结论:

基本数据类型、局部变量、String类型的直接赋值都是存放在栈内存中的,用完就消失。

new创建的实例化对象、String类型的构造方法new出来的对象及数组,是存放在堆内存中的,用完之后靠垃圾回收机制不定期自动消除。

地址是栈,就是静态绑定机制,执行完值不变化;地址是堆(对象在堆内储存,一般也会在栈里分配一个空间,去指向堆里的对象的地址)就是动态绑定机制,执行完值变化。

栈和堆

栈:基本类型变量,String类型的直接赋值变量,对象的实例变量都在函数的栈内存中分配。栈内存特点,数据一执行完毕,变量会立即释放,节约内存空间;并且必须初始化变量的值。

堆:堆内存用来存放new创建的对象、String类型的构造方法new出来的对象和数组。堆内存中所有的实体都有内存地址值,系统会自动初始化变量的值;当堆内存中的实体不再被指向时,JVM启动垃圾回收机制,自动清除。

举例1:

 public static void main(String[] args) {
         int sum = 0;
         String str = "abc";
         for(int i =1 ; i

如下图所示:

简述Java中的栈和堆,变量和对象的地址存放和绑定机制_第1张图片

以上程序执行步骤:

第1步——main()函数是程序入口,JVM先执行,在栈内存中开辟链两个空间,存放int类型变量sum,同时附值0;String类型变量                   str,并赋值"abc";
第2步——JVM执行for循环是,在栈内存中又开辟一个新的空间,存放int类型变量i,同时附值1。
     此时main空间与for空间并存,同时运行,互不影响。
第3步——for()执行完毕,变量i立即释放,空间消失。但是main()函数空间仍存在,main中的变量sum和str仍然存在,不受影                         响。

从上可以看出:基本数据类型、局部变量、String类型的直接赋值都是存放在栈内存中的,用完就消失。地址是栈,就是静态绑定机制,执行完值不变化。

举例2:

public class Test1 {
    int score;
    public static void main(String[] args) {
        int[] sum = {0,1,2};
        String str = new String("abc");
        Test1 test1 = new Test1();
        test1.score = 98;
        test1.showInfo();
    }
    public void showInfo(){
        System.out.println("我的成绩是"+score);
    }
}

上述代码的意思如下图所示:

简述Java中的栈和堆,变量和对象的地址存放和绑定机制_第2张图片

从上可以看出:new创建的实例化对象、String类型的构造方法new出来的对象及数组,是存放在堆内存中的,用完之后靠垃圾回收机制不定期自动消除。地址是堆(对象在堆内储存,一般也会在栈里分配一个空间,去指向堆里的对象的地址)就是动态绑定机制,执行完值变化。

总结:

基本数据类型、局部变量、String类型的直接赋值都是存放在栈内存中的,用完就消失。

new创建的实例化对象、String类型的构造方法new出来的对象及数组,是存放在堆内存中的,用完之后靠垃圾回收机制不定期自动消除。

地址是栈,就是静态绑定机制,执行完值不变化;地址是堆(对象在堆内储存,一般也会在栈里分配一个空间,去指向堆里的对象的地址)就是动态绑定机制,执行完值变化。

你可能感兴趣的:(java基础,java,堆栈,后端,大数据,c语言)