一、 对 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;

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

这里还是直接贴一张图比较好。

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

  1. 扎克伯格最新VR原型机来了,要让人混淆虚拟与现实的那种

    万博 发自 凹非寺 量子位 | 公众号 QbitAI 能让大脑误以为眼前虚拟场景是现实的VR眼镜,长什么样? 扎克伯格在最新的访谈中,给出一款原型机,要让人混淆虚拟和现实的那种: 而这款原型机背后的技 ...

  2. 我的Android进阶之旅------gt;解决Jackson等第三方转换Json的开发包在开启混淆后转换的实体类数据都是null的bug...

    1.错误描述 今天测试人员提了一个bug,说使用我们的app出现了闪退的bug,后来通过debug断点调试,发现我们的app转换服务器发送过来的json数据后,都是为null.而之前已经提测快一个月的 ...

  3. SEM那些被人混淆的事儿(已完结)

    我开场前先说几句闲话.本来我已经决定不再写东西了,一来是发现社区里面大咖们越来越多,各个的真知灼见让本小白受教不少,于是乎还是倾听为上为佳:二来,本人在回答问题的过程中发现,越分享越是发现自己对一些事 ...

  4. 扰人的异常:net.sf.json.JSONException: Object is null

    菜鸟的笔记-----异常1 Method public java.lang.String org.apache.commons.lang.exception.NestableRuntimeExcept ...

  5. RTX51 Tiny中容易混淆的问题

    RTX51 Tiny中容易混淆的问题 RTX51 Tiny是 Keil uVision中自带的一个小型嵌入式RTOS,具有小巧.速度快.系统开销小.使用方便等优点.使用RTX51 Tiny能够提高系统 ...

  6. 速记混淆矩阵中的FP、FN、FP、TN

    很多时候混淆矩阵中的这四个概念也很容易让人混淆. 只需要记住: 首字母 T / F 表示的是你预测对了True,还是错了False, 次字母 P / N 表示的是你预测的标签为正Positive,还是 ...

  7. 决策树分类评估指标之混淆矩阵

    问题的提出 如果决策树的目标是尽量捕获少数类,则准确率模型评估的意义不大,需要新的模型评估指标.简单来看,只需要查看模型在少数类上的准确率就好,只要能够将少数类尽量捕捉出来,就能够达到目的. 但是,新 ...

  8. 【历史上的今天】4 月 30 日:信息论之父出生;万维网对所有人免费开放;图灵奖算法先驱诞生

    整理 | 王启隆 透过「历史上的今天」,从过去看未来,从现在亦可以改变未来. 今天是 2022 年 4 月 30 日,在 2008 年的今天,千橡互动集团获得日本软银总额 400 亿日元的投资.千橡互 ...

  9. RTX51 tiny系统容易混淆的问题

    RTX51 Tiny是 Keil uVision中自带的一个小型嵌入式RTOS,具有小巧.速度快.系统开销小.使用方便等优点.使用RTX51 Tiny能够提高系统的稳定性,优化程序的性能;而且它是为5 ...

最新文章

  1. java 图片合成 工具类_Java实现的图片上传工具类完整实例
  2. Android Chromium WebView Crash
  3. windows8.1 windows defender service无法启动解决方案
  4. 989-数组形式的整数加法
  5. 通过钉钉群聊机器人推送zabbix告警
  6. SVN基本的理解和使用
  7. 银行推出一年存1万连着存5年,利率4.5%,能存吗?
  8. PHP Fatal error: Uncaught think\\exception\\ErrorException: error_log相关解决方法
  9. python 归一化_数据的标准化和归一化
  10. 【Elasticsearch】es Ingest 节点
  11. 给程序员的建议(转自李开复)
  12. exosip 和 pjsip 简介
  13. 虚拟机不能上网以及无法ping通百度的解决方案
  14. 「企业架构」TOGAF 和Zachman有什么区别?
  15. WPS永久关闭热点、云服务、初始登陆界面
  16. 欧姆龙nb触摸屏通信_欧姆龙触摸屏 NB系列
  17. SVN 文件夹图标不显示问题的解决办法
  18. winforms 文本框_在禁用的VB.Net WinForms文本框中自定义颜色的新方法
  19. 一个完整的App应该具备哪些功能
  20. 采用先进先出原则对货物的库存进行处理

热门文章

  1. 登录IE时常出现闪退:Internet Explorert停止工作解决办法
  2. java线程调度(优先级,休眠,让步,等待)
  3. 域名 超过注册日两年_域名 – “注册商注册过期日期”与实际到期日之间的关系...
  4. Mac开发利器之程序员编辑器MacVim
  5. 100首经典英文歌曲
  6. 报错 expect ‘:‘ at 0, actual = com.alibaba.fastjson.JSONException: expect ‘:‘ at 0, actual =
  7. Pylint同时屏蔽多个报错信息
  8. php wrap,php wordwrap函数怎么用
  9. 搜索导航HTML,CSS 带搜索导航栏的示例代码
  10. Unity与 SO 交互 ☀️| .so文件(动态链接库 ) 基础知识科普