java 堆和栈的区别

1,在栈中存放的是基本类型变量和对象的引用变量,当一段代码定义一个变量时,java

就在栈内为这个变量分配内存空间,当超过变量的作用域时,java会自动回收分配的内存。

     局部变量在栈内存

2,堆内存放的是new创建的对象和数组,有java jvm的垃圾回收器来管理。同时会在栈内

定义一个特殊变量,让这个变量的取值等于数组或对象在堆内的首地址,这个特殊变量就成了引用变量。

     成员变量在堆内存

参考:http://www.cnblogs.com/perfy/p/3820594.html

public static void main(String[] args) {
        int a1 = 10;
        int a2 = a1;
        a1 = 1000;
        System.out.println("a1=: " + a1);
        System.out.println("a2=: " + a2);
        String a3 = new String("10");
        String a4 = new String(a3);
        a3 = "1000";
        System.out.println("a3=: " + a3);
        System.out.println("a4=: " + a4);
    }

运行结果:
a1=: 1000
a2=: 10
a3=: 1000
a4=: 10
public class Test {
        public static void main(String[] args) {
                Test t = new Test();
                Test.Dog d1 = t.new Dog(1);//若看不懂,只需看成创建了一个Dog类一个实例变量
                Test.Dog d2 = d1;//把d1赋值个d2,此时d2的age是不是1?
                d1.age = 10;//重新为d1的age属性赋值成10
                //打印结果
                System.out.println("dog1's age = " + d1.age);
                System.out.println("dog2's age = " + d2.age);
        }
       
      //为了节省空间能一眼看完,此处写成内部类
        class Dog {
                //为了方便把属性定义为public,实际中最好不要
                public  int age;
                public Dog(int age) {
                        this.age = age;
                }

        }
}

运行结果:都是10
参考:http://www.cnblogs.com/wangjunxiao/p/5860454.html
http://www.360doc.com/content/08/0829/08/59141_1587076.shtml
原文地址:https://www.cnblogs.com/ysloong/p/6389302.html