開發與維運

带你“找对象”–Java内存分析 | 带你学《Java面向对象编程》之二

上一篇:触摸Java世界的核心:类与对象 | 带你学《Java面向对象编程》之一
【本节目标】
本章深入浅出,结合实例带你了解新建对象的过程中在物理内存上发生的故事,理解通过内存管理实现引用数据类型的流畅使用。通过本章,你将初步了解到堆内存、栈内存相关的知识,学会从内存上分析创建对象的原理,明白通过堆栈地址相互联系实现引用数据类型数据的调用原理。

2.1 对象实例化操作初步分析

范例:以下面的程序为主进行分析

public class JavaDemo {
    public static void main(String args[]) {
       Person per = new Person() ;     //声明并实例化对象
       per.name = “张三” ;
       per.age = 18 ;
       per.tell() ;            //进行方法的调用
   }
}

如果要进行内存分析,那么首先给出两块最为常用的内存空间:

  • 堆内存:保存的是对象的具体信息,在程序中堆内存空间的开辟是通过new完成的;
  • 栈内存:保存的是一块堆内存的地址,即:通过地址找到堆内存,而后找到对象内容。但是为了分析简化起见,可以简单地理解为:对象名称保存在了栈内存之中。

image.png
图一 堆内存与栈内存

清楚了以上的对应关系后,那么下面就针对于之前的程序进行分析。
Person per = new Person()

image.png
图二 对于Person per = new Person()的内存分析

per.name = “张三” ;

image.png
图三 对于per.name = “张三” ;的内存分析

per.age = 18 ;

image.png
图四 对于per.age = 18 ;的内存分析

在之前进行分析的时候可以发现对象的实例化有两种语法,一种是之前使用的声明并实例化对象,另外一种就是分步完成。
所以下面针对于分步的内存操作进行分析。
范例:定义程序代码

public class JavaDemo {
    public static void main(String args[]) {
      Person per = null;       //声明对象
      Person per = new Person() ;     //实例化对象
      per.name = “张三” ;
      per.age = 18 ;
      per.tell() ;            //进行方法的调用
  }
}

下面通过内存分析来进行解释。

image.png
图五 对于上述代码的内存分析

需要特别注意的是,所有的对象在调用类中的属性或方法的时候必须要实例化完成后才可以执行。
范例:错误的代码

public class JavaDemo {
    public static void main(String args[]) {
      Person per = null;       //声明对象
      per.name = “张三” ;
      per.age = 18 ;
      per.tell() ;            //进行方法的调用
  }
}

image.png
图六 运行结果

代码之中只是声明了对象,但是并没有为对象进行实例化,所以此时无法调用。而此时程序中出现的NullPointerException(空指向异常)就是在没有在堆内存开辟后时所产生的问题,并且只有引用数据类型存在有此问题。
想学习更多的Java的课程吗?从小白到大神,从入门到精通,更多精彩不容错过!免费为您提供更多的学习资源。
本内容视频来源于阿里云大学

下一篇:对象“变形记”--初识引用与GC | 带你学《Java面向对象编程》之三
更多Java面向对象编程文章查看此处

Leave a Reply

Your email address will not be published. Required fields are marked *