类和对象的内存分配机制
java内存的结构分析
- 栈:一般存放基本数据类型
- 堆:存放对象(Cat cat、数组等)
- 方法区:常量池(常量,比如字符串)、类加载信息
如下图:
cat是对象名,也就是所说的对象引用
new Cat()创建的对象空间(数据)才是真正的对象;
这只猫如果还有别的名字白喵喵,那指向的就是同一个猫对象,名字只是称呼(引用)
new Cat()创建的对象空间(数据)才是真正的对象
java创建对象的流程简单分析
- 加载Cat类信息(属性和方法信息,只会加载一次)
- 在堆中分配空间,进行默认初始化(规则:String默认null,int默认0,boolean默认false等)
- 把地址赋给cat,cat就指向对象
- 进行指定初始化,例如cat.name = "小白",cat.age = 10
举例进行分析:
/**
*
*/
public class Person {
//编写一个main方法
public static void main (String[] args) {
int arr[][] = new int[2][3];
arr[1][1] = 8;
Cat cat = new Cat();
cat.name = "大橘";
cat.age = 10;
cat.color = "橘色";
Cat c1 = cat;
System.out.println(c1.name);
c1.age = 11;
c1 = null;
System.out.println(cat.age);
System.out.println(c1.age);
}
}
class Cat {
public String name;
public String color;
public int age;
}
运行结果:
分析:
c1为null之后,它不再是一个对象,所以最后打印时会报空指针异常