Java--堆(进击的Java新人Week.3学习笔记)

Author: Oscar

目录

  • 堆的介绍
  • 堆的工作过程

堆的介绍

Java把内存划分为两种,一种是栈内存,另外一种是堆内存。 在函数中定义的一些基本类型的变量和对象的引用变量都是在函数的栈内存中分配的,而一般new出来的对象或者定义的数组,则分配到堆内存。

栈内存和堆内存区别之一是,栈内存能够在方法执行完后,自动出栈,自动销毁方法里的变量。而堆内存的对象需要交给Java的垃圾回收器处理,即垃圾回收机制。

在创建对象的时候,真正的对象存放在堆里,而对象的引用地址则存放在栈里。

堆的工作过程

示例

1
2
3
4
5
6
7
8
9
10
11
12
public class Demo03_01_05 {
public static void main(String args[]) {
A a = new A();
a.num = 5;
A aa = a;
aa.num = 6;
System.out.println(a.num);
}
}
class A {
int num = 4;
}

过程分析

  1. 当new A()时,A()放在堆里,同时num=4也在堆里,变量a 放在栈里,A()引用地址 0x005赋值给a
  2. a.num = 5,修改了A()里num的值为5
  3. A aa = a时,变量a把A()的引用地址赋值给变量aa,因此aa和a同时指向了A()
  4. aa.num = 6,修改了A()里num的值为6
  5. 如果变量a和aa都设为null,这时就没有变量引用这个对象,这个对象就成为了垃圾,Java的垃圾处理器就会在一定的时间内把这个对象回收。

传递String类型

1
2
3
4
5
6
7
8
9
10
public class Demo03_02_01 {
public static void main(String args[]) {
String a = "a";
change(a);
System.out.println("a:"+a);
}
public static void change(String a) {
a = "b";
}
}

java中String类型也是对象型变量,所以它传递的是引用的副本。String是一个非可变类,当字符串发生变化时,会自动生成一个新的String对象。