java 编程思想笔记之this关键字(包括一些对方法在内存中的分配的解析)

本文涉及的产品
全局流量管理 GTM,标准版 1个月
云解析 DNS,旗舰版 1个月
公共DNS(含HTTPDNS解析),每月1000万次HTTP解析
简介:
This关键字:只能在方法内部使用,表示对“调用方法的那个对象”的引用。
Leaf.java
public  class Leaf { 
             private  int i = 0; 
            Leaf increment() { 
                i++; 
                 return  this
            } 
             void print() { 
                System.out.println( "i = " + i); 
            } 
             public  static  void main(String[] args) { 
                Leaf x =  new Leaf(); 
                 //increment方法被对象x调用,这方法内的this指向x对象。 
                x.increment().increment().increment().print(); 
            } 
}
 
通常,当我们说this的时候,都是指这个对象或者当前对象。而且它本身会产生当前对象的一个引用。在一个构建器中,若为其赋予一个参数列表,那么this关键字会具有不同的含义:它会对与那个参数列表相符的构建函数进行明确的调用。这样一来,我们就可通过一条直接的途径来调用其他构建函数。
City.java
public  class City { 
         private  double code; 
         private String name;    
         //构造函数 
         public City( double code) { 
              this.code = code; 
        } 
         public City(String name){ 
              this.name = name; 
        } 
         public City( double code, String name) { 
              this(code); 
              //在一个构造函数中只能通过this调用一次其他构造函数 
              this(name); //将会报错 
              this.name = name; 
        }        
         //get方法 
         public  double getCode() { 
              return code; 
        }        
         public String getName() { 
              return name; 
        } 
         
         public  static  void main(String[] args){ 
             String str =  "凤山"
             City city1 =  new City(str); 
             City city2 =  new City(str); 
//方法在内存中只保存有一份。那怎样知道getName方法是被哪个对象调用?通过this知道。当city1调用getName方法时,this就相当于city1的引用,当city2调用getName方法时,this就相当于city2的引用。 
             System.out.println(city1.getName()); 
             System.out.println(city2.getName()); 
        } 

由于以上例子说到了方法在内存中只保存有一份,这里就解析一下方法的存储(个人理解)一个程序所占用的的内存,分为存储代码片段,存储数据片段和程序申请分配的内存(堆和栈)。方法作为程序代码片段,是不存在任何申请分配的问题的,因此既不会在堆中,也不会在堆栈中。
以下再截个图上来好理解(此图出自尚学堂视频):
现在知道了方法做为代码片段是存储在一个专门存储代码片段的内存中的,所以对于多个实例对象,它们共享这个方法代码片段。既然这样,对于上述例子中的 getName() 方法被 city1 city2 两个实例调用, getName() 方法是如何判断到底是哪个实例调用它的 name 值的呢?对了,它是通过 this 关键字来判断的。其实在 getName() 的方法中它隐藏了 this 关键字,它的写法可以是以下这样:
         public String getName() { 
              return  this.name; 
        }
在笔记开始我就写了this关键字表示对“调用方法的那个对象”的引用。现在明白了吧,当city1调用getName方法时,this就相当于city1的引用,当city2调用getName方法时,this就相当于city2的引用。所以虽然方法片段只有一份,但它可以通过this来区分引用。
总结:1. this关键字只能在方法内部使用,表示对“调用方法的那个对  象”的引用。
         2. 在一个构造函数中只能通过this调用一次其他构造函数。
3.方法片段在内存中只保存有一份,所以不同的实例调用方法时是通过this关键字来区分方法中的属性。
 









本文转自 yzzh9 51CTO博客,原文链接:http://blog.51cto.com/java999/136116,如需转载请自行联系原作者
目录
相关文章
|
1月前
|
监控 安全 网络安全
深入解析PDCERF:网络安全应急响应的六阶段方法
PDCERF是网络安全应急响应的六阶段方法,涵盖准备、检测、抑制、根除、恢复和跟进。本文详细解析各阶段目标与操作步骤,并附图例,助读者理解与应用,提升组织应对安全事件的能力。
268 89
|
3月前
|
存储 缓存 安全
Java内存模型深度解析:从理论到实践####
【10月更文挑战第21天】 本文深入探讨了Java内存模型(JMM)的核心概念与底层机制,通过剖析其设计原理、内存可见性问题及其解决方案,结合具体代码示例,帮助读者构建对JMM的全面理解。不同于传统的摘要概述,我们将直接以故事化手法引入,让读者在轻松的情境中领略JMM的精髓。 ####
59 6
|
3天前
|
编解码 缓存 Prometheus
「ximagine」业余爱好者的非专业显示器测试流程规范,同时也是本账号输出内容的数据来源!如何测试显示器?荒岛整理总结出多种测试方法和注意事项,以及粗浅的原理解析!
本期内容为「ximagine」频道《显示器测试流程》的规范及标准,我们主要使用Calman、DisplayCAL、i1Profiler等软件及CA410、Spyder X、i1Pro 2等设备,是我们目前制作内容数据的重要来源,我们深知所做的仍是比较表面的活儿,和工程师、科研人员相比有着不小的差距,测试并不复杂,但是相当繁琐,收集整理测试无不花费大量时间精力,内容不完善或者有错误的地方,希望大佬指出我们好改进!
46 16
「ximagine」业余爱好者的非专业显示器测试流程规范,同时也是本账号输出内容的数据来源!如何测试显示器?荒岛整理总结出多种测试方法和注意事项,以及粗浅的原理解析!
|
2月前
|
安全 Ubuntu Shell
深入解析 vsftpd 2.3.4 的笑脸漏洞及其检测方法
本文详细解析了 vsftpd 2.3.4 版本中的“笑脸漏洞”,该漏洞允许攻击者通过特定用户名和密码触发后门,获取远程代码执行权限。文章提供了漏洞概述、影响范围及一个 Python 脚本,用于检测目标服务器是否受此漏洞影响。通过连接至目标服务器并尝试登录特定用户名,脚本能够判断服务器是否存在该漏洞,并给出相应的警告信息。
200 84
|
2月前
|
数据可视化 项目管理
个人和团队都好用的年度复盘工具:看板与KPT方法解析
本文带你了解高效方法KPT复盘法(Keep、Problem、Try),结合看板工具,帮助你理清头绪,快速完成年度复盘。
139 7
个人和团队都好用的年度复盘工具:看板与KPT方法解析
|
2月前
|
存储 缓存 Java
Java 并发编程——volatile 关键字解析
本文介绍了Java线程中的`volatile`关键字及其与`synchronized`锁的区别。`volatile`保证了变量的可见性和一定的有序性,但不能保证原子性。它通过内存屏障实现,避免指令重排序,确保线程间数据一致。相比`synchronized`,`volatile`性能更优,适用于简单状态标记和某些特定场景,如单例模式中的双重检查锁定。文中还解释了Java内存模型的基本概念,包括主内存、工作内存及并发编程中的原子性、可见性和有序性。
Java 并发编程——volatile 关键字解析
|
1月前
|
人工智能 监控 数据可视化
提升开发效率:看板方法的全面解析
随着软件开发复杂度提升,并行开发模式下面临资源分配不均、信息传递延迟及缺乏全局视图等瓶颈问题。看板工具通过任务状态实时可视化、流量效率监控和任务依赖管理,帮助团队直观展示和解决这些瓶颈。未来,结合AI预测和自动化优化,看板工具将更高效地支持并行开发,成为驱动协作与创新的核心支柱。
|
2月前
|
存储 Java 开发者
浅析JVM方法解析、创建和链接
上一篇文章《你知道Java类是如何被加载的吗?》分析了HotSpot是如何加载Java类的,本文再来分析下Hotspot又是如何解析、创建和链接类方法的。
|
2月前
|
安全 编译器 C++
C++ `noexcept` 关键字的深入解析
`noexcept` 关键字在 C++ 中用于指示函数不会抛出异常,有助于编译器优化和提高程序的可靠性。它可以减少代码大小、提高执行效率,并增强程序的稳定性和可预测性。`noexcept` 还可以影响函数重载和模板特化的决策。使用时需谨慎,确保函数确实不会抛出异常,否则可能导致程序崩溃。通过合理使用 `noexcept`,开发者可以编写出更高效、更可靠的 C++ 代码。
60 1
|
2月前
|
Java 程序员
面试官的加分题:super关键字全解析,轻松应对!
小米,29岁程序员,通过一个关于Animal和Dog类的故事,详细解析了Java中super关键字的多种用法,包括调用父类构造方法、访问父类成员变量及调用父类方法,帮助读者更好地理解和应用super,应对面试挑战。
50 3

热门文章

最新文章

推荐镜像

更多