对象的创建和使用:内存解析

 总结一下上面这一段话便于记忆:

  • 堆区存储对象实例、数组
  • 栈区存储局部变量、对象引用
  • 方法区存储常量、静态变量、类信息、即时编译器编译后的代码

我的疑问:

  • 方法区存储类信息,都包含类的哪些信息?
  • 即时编译器是什么?作用是什么?

 

 

1 Person p1 = new Person();
2 p1.name = "Tom";
3 p1.isMale = true;
4 Person p2 = new Person();
5 sysout(p2.name);//null
6 Person p3 = p1;
7 p3.age = 10;

 

第一行,new 一个Perso类的对象,由p1指向。该对象在堆中开辟存储空间,String、int、Boolean类型的三个变量赋默认初始值。

第2,3行修改p1的name和isMale属性。

第4行new一个Person类的对象,由p2指向。

第6行定义p3,将p1赋值给p1,p1和p3指向同一个对象实例,第7 行修改p3的age属性,p1.age也会改变。

2022-05-14

后几页PPT的几个例子大同小异,等到后面的新例子再进行内存分析...

 

 

 

1 Student[] stus = new Student[5];
2 stus[0] = new Student();
3 sysout(stus[0].state);//1
4 sysout(stus[1]);//null
5 sysout(stus[1].number);//异常
6 stus[1] = new Student();
7 sysout(stus[1].number);//0

  class Student{
    int number;//学号
    int state = 1;//年级
    int score;//成绩
  }

 

第1行,new一个长度为5的数组。数组类型为Student类的对象。该数组存储在堆空间,数组引用stus存放在栈空间。

第2行,new 一个Student类的对象,该对象在堆空间开辟存储空间,该对象的引用存储在stus[0]位置。

第5行出现空指针异常,因为在第1行new数组时给sstus[0]~[4]位置都服了初始值null,stus[1].number即null.number,所以出现了空指针异常。

由上个例子总结一句话:堆存储new出来的东西。

 2022-05-15

posted on 2022-05-14 13:44  无名高地  阅读(38)  评论(0编辑  收藏  举报