带你“找对象”--Java内存分析 | 带你学《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面向对象编程文章查看此处

相关文章
|
22小时前
|
JSON Java fastjson
老程序员分享:java对象转json
老程序员分享:java对象转json
|
1天前
|
设计模式 缓存 Java
Java设计模式:享元模式实现高效对象共享与内存优化(十一)
Java设计模式:享元模式实现高效对象共享与内存优化(十一)
|
2天前
|
缓存 Java 程序员
Java内存模型深度解析:可见性、有序性和原子性
在多线程编程中,正确理解Java内存模型对于编写高效且无bug的并行程序至关重要。本文将深入探讨JMM的三大核心特性:可见性、有序性和原子性,并结合实例分析如何利用这些特性来避免常见的并发问题。
5 1
|
21小时前
|
缓存 Java
《JVM由浅入深学习九】 2024-01-15》JVM由简入深学习提升分(生产项目内存飙升分析)
《JVM由浅入深学习九】 2024-01-15》JVM由简入深学习提升分(生产项目内存飙升分析)
8 0
|
21小时前
|
设计模式 算法 Java
java策略模式简单分析
java策略模式简单分析
2 0
|
23小时前
|
存储 缓存 Java
Java对象内存布局深度解析
Java对象内存布局深度解析
8 0
|
1天前
|
Java UED 开发者
JVM逃逸分析原理解析:优化Java程序性能和内存利用效率
JVM逃逸分析原理解析:优化Java程序性能和内存利用效率
|
1天前
|
XML Java 数据格式
“MapStruct妙用指南:解锁Java对象映射的强大力量!“ ️
“MapStruct妙用指南:解锁Java对象映射的强大力量!“ ️
7 0
|
1天前
|
缓存 安全 Java
《volatile使用与学习总结:》多层面分析学习java关键字--volatile
《volatile使用与学习总结:》多层面分析学习java关键字--volatile
7 0
|
1天前
|
存储 安全 Java
小白聊《JAVA编程思想》-一切都是对象(一)
小白聊《JAVA编程思想》-一切都是对象(一)
5 0