带你“找对象”--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面向对象编程文章查看此处

相关文章
|
1月前
|
存储 缓存 Java
【高薪程序员必看】万字长文拆解Java并发编程!(5):深入理解JMM:Java内存模型的三大特性与volatile底层原理
JMM,Java Memory Model,Java内存模型,定义了主内存,工作内存,确保Java在不同平台上的正确运行主内存Main Memory:所有线程共享的内存区域,所有的变量都存储在主存中工作内存Working Memory:每个线程拥有自己的工作内存,用于保存变量的副本.线程执行过程中先将主内存中的变量读到工作内存中,对变量进行操作之后再将变量写入主内存,jvm概念说明主内存所有线程共享的内存区域,存储原始变量(堆内存中的对象实例和静态变量)工作内存。
65 0
|
2月前
|
监控 Java Unix
6个Java 工具,轻松分析定位 JVM 问题 !
本文介绍了如何使用 JDK 自带工具查看和分析 JVM 的运行情况。通过编写一段测试代码(启动 10 个死循环线程,分配大量内存),结合常用工具如 `jps`、`jinfo`、`jstat`、`jstack`、`jvisualvm` 和 `jcmd` 等,详细展示了 JVM 参数配置、内存使用、线程状态及 GC 情况的监控方法。同时指出了一些常见问题,例如参数设置错误导致的内存异常,并通过实例说明了如何排查和解决。最后附上了官方文档链接,方便进一步学习。
198 4
|
15天前
|
Java 数据库连接 API
互联网大厂校招 JAVA 工程师笔试题解析及常见考点分析
本文深入解析互联网大厂校招Java工程师笔试题,涵盖基础知识(数据类型、流程控制)、面向对象编程(类与对象、继承与多态)、数据结构与算法(数组、链表、排序算法)、异常处理、集合框架、Java 8+新特性(Lambda表达式、Stream API)、多线程与并发、IO与NIO、数据库操作(JDBC、ORM框架MyBatis)及Spring框架基础(IoC、DI、AOP)。通过技术方案讲解与实例演示,助你掌握核心考点,提升解题能力。
55 2
|
1月前
|
Java
深入JavaSE:详解Java对象的比较。
总的来说,Java对象的比较就像海洋生物的比较,有外在的,有内在的,有面对所有情况的,也有针对特殊情况的。理解并掌握这些比较方式,就能更好地驾驭Java的世界,游刃有余地操作Java对象。
53 12
|
1月前
|
人工智能 Java
Java参数传递分析
本文详细探讨了Java中参数传递的机制,明确指出Java采用的是值传递而非引用传递。通过基本数据类型(如int)和引用类型(如Map、自定义对象People)的实例测试,证明方法内部对参数的修改不会影响原始变量。即使在涉及赋值返回的操作中,表面上看似引用传递,实际仍是值传递的结果。文中结合代码示例与执行结果,深入解析了值传递的本质及容易引起混淆的情形,帮助读者准确理解Java参数传递的核心概念。
|
2月前
|
编解码 JavaScript 前端开发
【Java进阶】详解JavaScript的BOM(浏览器对象模型)
总的来说,BOM提供了一种方式来与浏览器进行交互。通过BOM,你可以操作窗口、获取URL、操作历史、访问HTML文档、获取浏览器信息和屏幕信息等。虽然BOM并没有正式的标准,但大多数现代浏览器都实现了相似的功能,因此,你可以放心地在你的JavaScript代码中使用BOM。
99 23
|
3月前
|
存储 缓存 算法
JVM简介—1.Java内存区域
本文详细介绍了Java虚拟机运行时数据区的各个方面,包括其定义、类型(如程序计数器、Java虚拟机栈、本地方法栈、Java堆、方法区和直接内存)及其作用。文中还探讨了各版本内存区域的变化、直接内存的使用、从线程角度分析Java内存区域、堆与栈的区别、对象创建步骤、对象内存布局及访问定位,并通过实例说明了常见内存溢出问题的原因和表现形式。这些内容帮助开发者深入理解Java内存管理机制,优化应用程序性能并解决潜在的内存问题。
219 29
JVM简介—1.Java内存区域
|
1月前
|
缓存 安全 Java
【高薪程序员必看】万字长文拆解Java并发编程!(3-1):并发共享问题的解决与分析
活锁:多个线程相互影响对方退出同步代码块的条件而导致线程一直运行的情况。例如,线程1的退出条件是count=5,而线程2和线程3在其代码块中不断地是count进行自增自减的操作,导致线程1永远运行。内存一致性问题:由于JIT即时编译器对缓存的优化和指令重排等造成的内存可见性和有序性问题,可以通过synchronized,volatile,并发集合类等机制来解决。这里的线程安全是指,多个线程调用它们同一个实例的方法时,是线程安全的,但仅仅能保证当前调用的方法是线程安全的,不同方法之间是线程不安全的。
37 0
|
1月前
|
Java 程序员
【高薪程序员必看】万字长文拆解Java并发编程!(3-2):并发共享问题的解决与分析
wait方法和notify方法都是Object类的方法:让当前获取锁的线程进入waiting状态,并进入waitlist队列:让当前获取锁的线程进入waiting状态,并进入waitlist队列,等待n秒后自动唤醒:在waitlist队列中挑一个线程唤醒:唤醒所有在waitlist队列中的线程它们都是之间协作的手段,只有拥有对象锁的线程才能调用这些方法,否则会出现IllegalMonitorStateException异常park方法和unpark方法是LockSupport类中的方法。
41 0
|
2月前
|
Java 数据安全/隐私保护
Java 类和对象
本文介绍了Java编程中类和对象的基础知识,作为面向对象编程(OOP)的核心概念。类是对象的蓝图,定义实体类型;对象是具体实例,包含状态和行为。通过示例展示了如何创建表示汽车的类及其实例,并说明了构造函数、字段和方法的作用。同时,文章还探讨了访问修饰符的使用,强调封装的重要性,如通过getter和setter控制字段访问。最后总结了类与对象的关系及其在Java中的应用,并建议进一步学习继承等概念。