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

简介:
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,如需转载请自行联系原作者
目录
相关文章
|
11天前
|
存储 Java 编译器
Java内存区域详解
Java内存区域详解
27 0
Java内存区域详解
|
21天前
|
缓存 算法 Java
Java内存管理与调优:释放应用潜能的关键
【4月更文挑战第2天】Java内存管理关乎性能与稳定性。理解JVM内存结构,如堆和栈,是优化基础。内存泄漏是常见问题,需谨慎管理对象生命周期,并使用工具如VisualVM检测。有效字符串处理、选择合适数据结构和算法能提升效率。垃圾回收自动回收内存,但策略调整影响性能,如选择不同类型的垃圾回收器。其他优化包括调整堆大小、使用对象池和缓存。掌握这些技巧,开发者能优化应用,提升系统性能。
|
17天前
|
缓存 安全 Java
Java并发编程进阶:深入理解Java内存模型
【4月更文挑战第6天】Java内存模型(JMM)是多线程编程的关键,定义了线程间共享变量读写的规则,确保数据一致性和可见性。主要包括原子性、可见性和有序性三大特性。Happens-Before原则规定操作顺序,内存屏障和锁则保障这些原则的实施。理解JMM和相关机制对于编写线程安全、高性能的Java并发程序至关重要。
|
25天前
|
缓存 Java C#
【JVM故障问题排查心得】「Java技术体系方向」Java虚拟机内存优化之虚拟机参数调优原理介绍(一)
【JVM故障问题排查心得】「Java技术体系方向」Java虚拟机内存优化之虚拟机参数调优原理介绍
67 0
|
7天前
|
存储 缓存 监控
Java内存管理:垃圾回收与内存泄漏
【4月更文挑战第16天】本文探讨了Java的内存管理机制,重点在于垃圾回收和内存泄漏。垃圾回收通过标记-清除过程回收无用对象,Java提供了多种GC类型,如Serial、Parallel、CMS和G1。内存泄漏导致内存无法释放,常见原因包括静态集合、监听器、内部类、未关闭资源和缓存。内存泄漏影响性能,可能导致应用崩溃。避免内存泄漏的策略包括代码审查、使用分析工具、合理设计和及时释放资源。理解这些原理对开发高性能Java应用至关重要。
|
15天前
|
存储 算法 安全
深度解析JVM世界:JVM内存分配
深度解析JVM世界:JVM内存分配
|
15天前
|
存储 缓存 安全
【企业级理解】高效并发之Java内存模型
【企业级理解】高效并发之Java内存模型
|
20天前
|
存储 缓存 监控
深入解析linux内存指标:快速定位系统内存问题的有效技巧与实用方法(free、top、ps、vmstat、cachestat、cachetop、sar、swap、动态内存、cgroops、oom)
深入解析linux内存指标:快速定位系统内存问题的有效技巧与实用方法(free、top、ps、vmstat、cachestat、cachetop、sar、swap、动态内存、cgroops、oom)
|
22天前
|
Java
java中jar启动设置内存大小java -jar 设置堆栈内存大小
java中jar启动设置内存大小java -jar 设置堆栈内存大小
11 1
|
22天前
|
缓存 算法 Java
Java内存管理:优化性能和避免内存泄漏的关键技巧
综上所述,通过合适的数据结构选择、资源释放、对象复用、引用管理等技巧,可以优化Java程序的性能并避免内存泄漏问题。
25 5

推荐镜像

更多