【内存分析】变量的使用与this

简介: 学习Java时,理解内存分析很重要。我们知道程序运行的方式和代码执行的顺序,如知道了牛的骨架一样。理解的越清晰,越能像庖丁解牛,游刃有余。 我们知道,当一个方法运行时,JVM会在栈内存中开辟一片属于此方法的空间,让此方法在这片空间内执行; 比如:JVM在执行控制台程序时,在栈内存中为main开辟一个空间。 (我们通过将代码与图对应来进行解析)

学习Java时,理解内存分析很重要。我们知道程序运行的方式和代码执行的顺序,如知道了牛的骨架一样。理解的越清晰,越能像庖丁解牛,游刃有余。


    我们知道,当一个方法运行时,JVM会在栈内存中开辟一片属于此方法的空间,让此方法在这片空间内执行;


    比如:JVM在执行控制台程序时,在栈内存中为main开辟一个空间。


    (我们通过将代码与图对应来进行解析)


20170213202437602.png


 解析:

1.在main方法中声明变量a;

   在栈内存的main方法中为a开辟一个小空间。



2.new animal;

   在堆内存中创建animal对象,有name和color属性,如果在类中已设置属性值,初始化时可以有默认初始

值;



3.执行eat方法时,JVM会为eat方法开发一个属于这个方法的空间:eat();

 

4.Java采取就近原则机制访问

   如果name在当前正在执行的内存空间中,就执行此空间内的name(局部变量)。如果不在,再去堆内存

找name(成员变量)。



在上图代码中,执行eat方法时,会先执行name=“老鼠”;如果eat方法中没有为name赋值,则执行堆中的name=“狗”。

 

5、当局部变量和成员变量名称相同时,我们想执行的name是成员变量的name而不是局部变量的name;


使用this关键字:this代表了所属函数调用者对象(哪个对象调用eat方法,this就指哪个对象)


通过this.name来获取成员变量中的name值。


  (如果在一个方法中,访问了一个变量,该变量只存在成员变量的情况下,Java编译器会在该变量的前面添加this关键字。)


6、一个函数的形式参数也属于局部变量,当我们想输出成员变量时,则使用局部变量给成员变量赋值



This.id=id;

   This.name=name;

   因为:存在同名 的成员变量与局部变量,在方法内部默认是使用局部变量的。



7、调用本类中的构造方法;

    this(name);  //调用只有一个参数的构造方法;

    this() ;              //调用没有参数的构造方法;

 

注:this关键字使用的注意事项:


    1.this关键字调用其他的构造函数时,this关键字必须要位于构造函数中的第一个语句。


    2. this关键字在构造函数中不能出现相互调用的情况,因为是一个死循环。


   以上是对内存分析结合部分代码进行的概念性总结,如有疑问,欢迎大家批评指正。










相关文章
|
20天前
|
Web App开发 监控 JavaScript
监控和分析 JavaScript 内存使用情况
【10月更文挑战第30天】通过使用上述的浏览器开发者工具、性能分析工具和内存泄漏检测工具,可以有效地监控和分析JavaScript内存使用情况,及时发现和解决内存泄漏、过度内存消耗等问题,从而提高JavaScript应用程序的性能和稳定性。在实际开发中,可以根据具体的需求和场景选择合适的工具和方法来进行内存监控和分析。
|
1月前
|
编译器 C语言
动态内存分配与管理详解(附加笔试题分析)(上)
动态内存分配与管理详解(附加笔试题分析)
49 1
|
2月前
|
程序员 编译器 C++
【C++核心】C++内存分区模型分析
这篇文章详细解释了C++程序执行时内存的四个区域:代码区、全局区、栈区和堆区,以及如何在这些区域中分配和释放内存。
53 2
|
14天前
|
开发框架 监控 .NET
【Azure App Service】部署在App Service上的.NET应用内存消耗不能超过2GB的情况分析
x64 dotnet runtime is not installed on the app service by default. Since we had the app service running in x64, it was proxying the request to a 32 bit dotnet process which was throwing an OutOfMemoryException with requests >100MB. It worked on the IaaS servers because we had the x64 runtime install
|
24天前
|
Web App开发 JavaScript 前端开发
使用 Chrome 浏览器的内存分析工具来检测 JavaScript 中的内存泄漏
【10月更文挑战第25天】利用 Chrome 浏览器的内存分析工具,可以较为准确地检测 JavaScript 中的内存泄漏问题,并帮助我们找出潜在的泄漏点,以便采取相应的解决措施。
147 9
|
29天前
|
并行计算 算法 IDE
【灵码助力Cuda算法分析】分析共享内存的矩阵乘法优化
本文介绍了如何利用通义灵码在Visual Studio 2022中对基于CUDA的共享内存矩阵乘法优化代码进行深入分析。文章从整体程序结构入手,逐步深入到线程调度、矩阵分块、循环展开等关键细节,最后通过带入具体值的方式进一步解析复杂循环逻辑,展示了通义灵码在辅助理解和优化CUDA编程中的强大功能。
|
1月前
|
程序员 编译器 C语言
动态内存分配与管理详解(附加笔试题分析)(下)
动态内存分配与管理详解(附加笔试题分析)(下)
47 2
|
1月前
|
C++
析构造函数就是为了释放内存,就是在局部指针消失前释放内存,拷贝构造函数就是以构造函数为模块,在堆里面新开一块,同一个变量在堆里面的地址
本文讨论了C++中构造函数和析构函数的作用,特别是它们在管理动态内存分配和释放中的重要性,以及如何正确地实现拷贝构造函数以避免内存泄漏。
38 2
|
2月前
|
算法 程序员 Python
程序员必看!Python复杂度分析全攻略,让你的算法设计既快又省内存!
在编程领域,Python以简洁的语法和强大的库支持成为众多程序员的首选语言。然而,性能优化仍是挑战。本文将带你深入了解Python算法的复杂度分析,从时间与空间复杂度入手,分享四大最佳实践:选择合适算法、优化实现、利用Python特性减少空间消耗及定期评估调整,助你写出高效且节省内存的代码,轻松应对各种编程挑战。
41 1
|
2月前
|
存储 Prometheus NoSQL
Redis 内存突增时,如何定量分析其内存使用情况
【9月更文挑战第21天】当Redis内存突增时,可采用多种方法分析内存使用情况:1)使用`INFO memory`命令查看详细内存信息;2)借助`redis-cli --bigkeys`和RMA工具定位大键;3)利用Prometheus和Grafana监控内存变化;4)优化数据类型和存储结构;5)检查并调整内存碎片率。通过这些方法,可有效定位并解决内存问题,保障Redis稳定运行。