让人混淆的Person p=new Person();和Person p=null;

2023-05-16

一、 对 Person p=new Person()的理解

  1. 要理解这个问题,首先要知道整个过程中内存中发生了什么!我们知道,内存中我们最常用的就是三个:栈、堆、方法区。其中对于基本值类型和引用变量(就是User user;中的user)来说,它们是存储在栈内存中的;而new出来的东西都是存储在堆内容中;而成员变量和成员方法在随着类的加载存储在方法区中。
  2. Person p=new Person();其实是两行代码的合并,我们将其分开再结合内存可以更好的理解这个问题。 Person p=new Person();其实等价于 Person person; person=new Person();文章最后会简单讲一下Person person = new Person(); Person person=null;的区别
  3. 下面我们就可以去更深入的去理解这个问题了。创建一个对象都在内存中做了什么事情?
  • 3.1.JVM先将硬盘上指定位置的Person.class文件加载进内存(如果该对象有直接父类则会先加载父类)----方法区也称为数据区。
  • 3.2.执行main方法时,在栈内存中开辟了main方法的空间(压栈-进栈),然后在main 方法的栈区分配了一个变量p。— 这个可以将p看成一个引用变量(存在于main的栈内存中)
  • 3.3执行new Person():在堆内存中开辟一个实体空间,然后将成员变量和成员方法放在new实例中。将该对象的成员变量默认实例化,int类型为0,String类型为null…,同时产生一个堆内存首地址值。
  • 3.4.调用该实体对应的构造函数,进行构造函数初始化
  • 3.5.将首地址赋值给p ,p变量就引用了该实体。(指向了该对象)

对于上面的3.2和3.3,我们要知道程序的执行过程和执行过程中内存中发生的变化(其实主要是相关方法的压栈和弹栈的过程,当最后main方法弹栈跳转栈内存的时候,说明程序彻底执行完成了)。这个执行过程网上有很多好的文章来讲解这个问题,本人就不在这里献丑了。下面我为大家推荐一篇博文(自认为程序的执行过程非常重要,对于理解成员变量、局部变量的初始化问题、变量的作用域、方法的执行等都非常重要,大家一定要理解)。

对象实例化过程:[https://blog.csdn.net/weixin_44989801/article/details/107404653]
这里还是为大家贴出一张图,来简要的展示一下:

上面就是Person person =new Person()的简单分析。
在这里插入图片描述

二、3. Person p=new Person() 和 Person p=null

其实这个问题很简单,当我们通过上面的分析之后,可以很轻易的区分这两行代码。但是之前不知脑子咋啦,就是转不过弯来,所以一并在这里记录下来。

1.首先 Person p=new Person() 会在栈、堆内存中都开辟一块空间,然后把堆中该部分的 地址值赋值给p变量,此时p不是null,因为p存储的是地址值
2.Person p=null; 这个只会在堆内存中开辟空间

对于第一种声明方式p不是null 这个一定要注意。

Person p;这个过程只是在栈内存中开辟一块空间(其他的什么也没有做),在执行完new Person();这行代码后会在堆内存中开辟一块空间,同时分配一个指向它的内存首地址值,并赋值给p;

三、成员变量和局部变量的区别

这里还是直接贴一张图比较好。在这里插入图片描述

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

让人混淆的Person p=new Person();和Person p=null; 的相关文章

随机推荐

  • distributor之Interrupt Set-Enable Registers, GICD_ISENABLERn

    相对于distributor基地址偏移区间在0x100 0x17C 此寄存器就是把对应的中断使能 xff0c 使之可以被触发上报处理器 xff1b 此寄存器是写0无效的 xff0c 所以在写此寄存器时可以直接写 xff0c 不用再先读再或再
  • pip怎么安装到用户目录(不需要管理员权限),怎样安装指定python版本的包

    1 pip怎么安装到用户目录 xff08 不需要管理员权限 xff09 在用户的Home目录底下有个 pip目录 xff0c 即 pip xff0c 在这里面新建一个pip conf xff0c 里面写上 install install o
  • 时间机器测试

    这创意实在太搞 xff0c 不得不转载 xff1a 1 准备一张厚厚的 xff0c 防水的 xff0c 质量好的纸 xff0c 至少要100克的 xff0c 但表面不能太光滑 xff0c 防止墨迹脱落 2 在纸上用郑重的语气写上 xff0c
  • Android输入系统流程介

    Android输入系统的工作原理概括来说 xff0c 就是监控 dev input 下的所有设备节点 xff0c 当某个节点有数据可读时 xff0c 将数据读出并进行一系列的翻译加工 xff0c 然后在所有的窗口中寻找合适的事件接收者 xf
  • IntelliJ IDEA 恢复出厂设置

    引言 如果你不小心修改了设置 xff0c 导致出现问题且不知道解决办法 xff0c 可以尝试恢复出厂设置 IDEA 恢复出厂设置 IDEA 2021 之后 xff0c 在顶部工具栏 xff0c 选择 File Manage IDE Sett
  • Ozone调试

    SEGGER Ozone调试器使用攻略 xff01
  • Ubuntu 20.04 LTS安装opencl

    CPU AMD Ryzen threadripper 3970x 32 core processor 64 内存 220 1 GiB 图形 AMD Radeon rx 580 2048sp DiskCapacity 3 8 TB OS Na
  • 逻辑左移、逻辑右移、算术左移、算术右移区别

    更新于20200715 xff1a 逻辑移位和算术移位不同 xff0c 否则汇编指令就保留一个就行了 xff0c 干嘛还保留2个呢 xff1f 因此 xff1a 逻辑移位主要用于无符号数的移位 xff0c 左移和右移均是移丢一位 43 空位
  • ubuntu 12.04 开不了机,一直停留在最初启动界面,ubuntu恢复最初环境变量,成功解决

    ubuntu 开不了机 xff0c 一直停留在最初启动界面 xff0c ubuntu恢复最初环境变量 xff0c 本人因为要更改jdk环境变量 xff0c 结果不小心更改环境变量后系统就不能正常启动了 xff0c 我主要改了 etc env
  • 搭建本地服务器时显示找不到www.xxxxx.com的服务器IP地址

    检查 C Windows System32 drivers etc 下面的host文件是否有添加指向你的域名
  • 洛谷 P4180 【模板】严格次小生成树[BJWC2010] LCT

    首次采用了压行 xff0c 感觉还不错 Code luogu judger enable o2 include lt cstdio gt include lt algorithm gt include lt cstring gt inclu
  • linux下提示:command not find解决方法

    在linux下我们经常输入某些命令时经常出现提示说 xff1a command notfind 对此网上已经有很多人对此作了阐述 xff0c 但是对于菜鸟来说可能仍然不理解 xff0c 下面我我对这个做一下详细说明 首先 当出现 comma
  • Android Studio获取SQLite数据并显示到ListView上

    我们在使用ListView的时候需要和数据进行绑定 xff0c 那么问题来了 xff0c 如何获取SQLite数据库中的数据并动态的显示到ListView当中呢 xff1f 其实过程很简单 xff1a 首先要获取SQLite数据 xff08
  • Windows7重新安装IIS显示 "出现错误,并非所有的功能被成功更改"

    最近重新安装IIS时突然显示 出现错误 xff0c 并非所有的功能被修改 起初以为是在删除IIS时勿把一些重要文件一并给删除了 xff0c 按照网上查到的资料都试了一遍也都没有成功 最后在查看系统正在运行的 服务 时发现原来是和IIS相关的
  • android调用百度地图实现地理围栏

    效果 xff1a 实现功能 xff1a 后台定位地图长按添加marker得到当前位置经纬度坐标创建地理围栏 xff08 以marker所在位置为中心 xff0c 半径默认设置为100米 xff09 通过BroadcastReceiver监听
  • 如何使用 Postman 登录后,自动填充 token

    简介 Postman版本 xff1a v9 5 0 原理 xff1a Postman 支持配置变量 xff0c 将登录 Token 配置为变量 xff0c 每次登陆后更新该变量值 xff0c 就可以实现自动填充 Token 登陆后更新变量值
  • java中接口的使用(默认方法和静态方法)

    由于最近在学习接口这一部分 xff0c 就想着记下来 xff0c 以便以后的复习 如果那里有写的不对的请指正 xff01 1什么是接口 xff08 接口概述 xff09 既然要用接口首先要明确什么是接口 xff0c 它能帮助我们实现什么哪些
  • java方法重载与返回值类型无关

    方法的重载是指方法的名称相同而参数列表不同的方法 这里的参数列表不同主要包括 xff1a 参数的类型不同参数的个数不同 个数不同一定构成重载 具有多个且类型不同的参数 xff0c 其顺序不同构成重载 第三种情况是最容易被忽视的 比如 这里的
  • mysql显示cannot connect to mysql server on localhost(10061)

    今天打开mysql突然提示 xff0c 无法连接 xff0c 重启了几次也不能解决问题 之前使用都是好好的 xff0c 什么也没有动今天突然就打不开了 之前有过一次重装mysql的经历 xff0c 繁琐的步骤然我果断放弃了重装这条路 在我仔
  • 让人混淆的Person p=new Person();和Person p=null;

    一 对 Person p 61 new Person 的理解 要理解这个问题 xff0c 首先要知道整个过程中内存中发生了什么 xff01 我们知道 xff0c 内存中我们最常用的就是三个 xff1a 栈 堆 方法区 其中对于基本值类型和引