首页 > 系统相关 >Java之对象内存分析

Java之对象内存分析

时间:2023-10-04 11:57:18浏览次数:36  
标签:Java 对象 per Person 实例 内存 new

相信大家有时候在读代码的时候应该都会有以下情况:

  • 这个对象本定义在上面,乱跑什么?怎么又到下面去了?
  • 欸?我明明改变了这个对象的值,怎么没变呢?

要想搞清楚某一对象在程序中是怎样活蹦乱跳的,首先我们要对其内存的状况要有些了解。

在java中,类是属于引用数据类型,而引用数据类型最大的难点在于数据的内存管理,在操作过程中内存的变化会比较多。

在用以上代码内存分析之前,先来了解两种常见内存划分

- 堆内存:保存对象的具体信息。堆内存通过关键字new来开辟空间。

- 栈内存:保存的是所指堆内存的地址。再通过堆内存找到对象的信息。
(栈就相当于客栈嘛,找到客栈具体地址,就能找到客栈主人。便于理解)

画个图更直观的了解一下

来看一段简单代码:

class Person{   //定一个“个人”类
	String name;//人的姓名
	int age;    //人的年龄
	public void tell(){
		System.out.println("姓名:"+name+" 年龄:"+age);
	}
}
class Test{
	public static void main(String []args){
		Person per = new Person();//创建一个对象
		per.name = "小明";//该对象姓名
		per.age = 18;//该对象年龄
		per.tell();
	}
}

这个是一个简单的java类,运行结果如下:

还是用图来解释:

对于Person per = new Person();这句话中,关键字new是用来开辟一个新的堆内存来存放数据,这里我们目前还没有放数据,所以所定义的属性首先保持默认值。

紧接着per.name = "小明"; per.age = 18;这两句就是把所设置的数据放入堆内存。

我们在【Java面向对象修习之路 第一节】什么是对象中“通过类声明一个对象”可知道实例化对象是有两种方法。在上面的的代码中属于第一种情况:声明并实例化
第二种情况是分布进行,所以实例化的代码将会变成:

Person per = null;//先声明
per = new Person();//后实例化

然后赋值语句一样

注意!!!
所有对象在调用类的属性和方法都必须在完成实例化之后,若 没有 进行实例化,则会出先以下报错:

其中NullPointerException是无实例化的意思。这个问题是指创建一个堆内存所出现,并且此问题只会出现在引用对象类型

内存问题会导致很多问题的出现,想要读懂代码,学会内存分析是第一步,下一步是引用分析。
引用分析会在下一节来分享,感谢观看。

标签:Java,对象,per,Person,实例,内存,new
From: https://www.cnblogs.com/meloo/p/17742067.html

相关文章

  • 什么是面向对象?
    目录什么是面向过程?什么是面向对象?面向对象的主要特征一.封装性二.继承性三.多态性Java语言最大的特点在于面向对象的编程设计。Java也是从面向过程逐渐传向面向对象。上一节我们脑海中已经有了对象的概念,这节课我们来从以下几个方面全方位修习面向对象这一部分。(这节属于八股文......
  • Servlet作用域对象
    一、Servlet三大域对象1、Request(HttpServletRequest):生命周期:创建:客户端向服务器发送一次请求,服务器就会创建request对象销毁:服务器对这次请求作出响应后就会销毁request对象有效:仅在当前请求中有效,如果web组件之间需要共享同一个请求中的数据,只能使用请求转发常用方法:......
  • Java语言基础知识全总结
    一.Java的优点1.      跨平台性。一次编译,到处运行。Java编译器会将Java代码编译成能在JVM上直接运行的字节码文件,C++会将源代码编译成可执行的二进制代码文件,所以C++执行速度快2.      纯面向对象。Java所有的代码都必须在类中书写。C++兼具面向对象和面向过程的特......
  • Java新特性中的Preview功能如何运行和调试
    在每个Java新版本发布的特性中,都会包含一些Preview(预览)功能,这些功能主要用来给开发者体验并收集建议。所以,Preview阶段的功能并不是默认开启的。如果想体验某个Java版本中的Preview功能,您还需要做一些设置才能把程序跑起来。下面以IDEA2023.2为例,演示为Java21开启Preview功能......
  • JAVA入门——方法引用
    把已经有的方法拿过来用,当作函数式接口中抽象方法的方法体引用出必须是函数式接口被引用的方法必须已经存在被引用方法的形参和返回值需要和抽象方法保持一致被引用方法的功能要满足当前要求::双冒号是方法引用符 方法引用的分类引用静态方法:格式类名::静态......
  • 达梦数据库使用内存监控指导
    达梦数据库使用内存监控指导2.1如何判断内存池空闲还是紧张v$mem_pool可以查看所有内存池的使用信息。当前系统的内存池总大小可以通过以下语句查询,单位是M:selectname,--内存池名称is_shared,--是否是共享的is_overflow,--是否用到了备份池org_size/1024.0/1024.0,--......
  • java——mysql随笔——运维——分库分表&MyCat
    分库分表:                    介绍:                    拆分方式:                                     ......
  • Java JDBC连接数据库的CURD操作(JDK1.8 + MySQL8.0.33 + mysql-connector-java-8.0.27-
    JDBC概述JDBC(JavaDatabaseConnectivity)是一个独立于特定数据库管理系统、通用的SQL数据库存取和操作的公共接口(一组API),定义了用来访问数据库的标准Java类库,(java.sql,javax.sql)使用这些类库可以以一种标准的方法、方便地访问数据库资源。JDBC为访问不同的数据库提供了一......
  • windows 下载Java JDK方法
    一、页面https://www.oracle.com二、按照下图页面操作即可点击Products->点解Java滑到底部,点击DownloadJavaNow选择对应版本下载即可 ......
  • Java中的对象到底是什么
    对象是现实世界中的一切物体(实体,或能够定义的东西)Smalltalk是第一个成功的面向对象的语言在编程世界中,对象通过类来实例化;同一个类型的对象可以接受相同的消息状态+行为+标识=对象每个对象在内存中都会有一个唯一的地址。对象学习内容:组合,继承,多态,封装。类和对象类和对象时......