在我们讲构造函数的时候,我们知道,如果同时在java的堆内存当中,同时存在好几个刚进内存,但是又没来得及初始化的同一个类的对象。在这种情况下,那么如何去区分栈内存当中的构造函数是属于那个对象的呢,其实从底层上来讲的话,JVM已经为我们分好了,然后给了我们一个this,这个this是一个关键字,也是区分调用该构造函数的时候,此时的构造函数的所属对象是谁。

示例:

class ThisDemo
{ int num; String name; ThisDemo(int n)
{ num = n; } ThisDemo(String s)
{ name = s; } ThisDemo(String s,int n)
{ name = s;
num = n; } void sayDemo()
{ System.out.println(num+"----"+name); } } class ThisDemoR
{ public static void main(String[] args) { ThisDemo ts = new ThisDemo(10);
ThisDemo ts2 = new ThisDemo(10);
ts.sayDemo(); } }

  

这个就作为我们讲解this的基本代码。

但是如果我们对第二个构造函数稍做修改的话,比如:

	ThisDemo(String name)
{ name = s; }

  我们改成这个样子,那么调用这个构造函数的时候会发生什么呢?我们用一个内存图来描述下:

这个时候我们得出了什么结论,很明显嘛,当你传的参数值,跟你的成员变量名字相同的时候,你做就是一次无用功啊,java是伟大的,他给我们提供了一个关键词附带着方法,此时我们只需要让这个同名的name指向堆,这个时候,赋值就会赋给堆中的变量了。代码怎么体现呢?

	ThisDemo(String name)
{ this.name = name; }

  这里this的作用是区分栈内存的同名变量,意思是指我的这个变量是在堆内存当中的,你要去堆内存找才可以,并且要看好了,我是属于某某的别找错了。这个就是this的一个作用。

  

  另外一个要提到的就是我们当构造函数调用构造函数的时候,应该怎么写,这个时候对象都还没有初始化呢?比如在第三个构造函数当中,我们知道他的作用就是初始化num还有name,但是前面的两个构造函数这些都已经声明过了,这里我们再声明一遍的话就略显重复了,我们来修改一下,让第三个构造函数通过调用前两个构造函数来实现他原先的功能。大家第一个想到的可能是这么写:

	ThisDemo(String s,int n)
{ //this.ThisDemo(int n);//书写错误,函数内不能声明函数
//this.ThisDemo(String s);//同上 /**
*如果这个样子调用的话会提示,找不到方法ThisDemo(int),为什么会这么提示呢,因为类似于this.变量名的这种
*调用格式必须要在对象初始化完成之后才能够调用,在未初始化,但是又调用的时候就会报找不到方法这种错误
*/
//this.ThisDemo(n);
//反例反例反例反例
//this.ThisDemo(s); /**
*正确的初始化方法是直接用this,为什么直接用this可以呢,因为这里的this()这里就是深一层的对象初始化,因为他后
*面直接跟的是参数,就是给这个正在初始化的对象说,兄弟,先把这个初始化完成,完成之后咱再继续,就相当于this
*在初始化之前,调用初始化函数,但是在初始化函数返回对象之前,内部又调用了一次初始化,将内部初始化完成之后的对象
*返回给现在正在执行初始化的构造函数,让她继续去初始化。完成后返回一个对象
*/
this(n);//这个才是正确的
/**
*这里还需要注意的一点就是,这两个初始化语句的顺序问题,如果我们把下面的这条语句挪到上面来,会出现什么,艹了,会出现错误啊
*为么?你初始化都没完,自然没有返回对象,没有返回对象还调用个毛啊,上面都说了,this.成员 这种调用方法只能在对象已经存在的
*情况下才可以使用,没存在没法使用的
*/
this.name = s;
//ThisDemo(String s); }

  

最新文章

  1. laravel数据库迁移(三)
  2. RequireJS与SeaJS模块化加载示例
  3. Jenkins启动时报错:java.net.BindException: Address already in use: bind 解决方法
  4. Linux权限扩展
  5. [BZOJ1101][POI2007]Zap
  6. 【转】Android-Universal-Image-Loader 图片异步加载类库的使用(超详细配置)
  7. 关于矩阵最通俗的解释-超级经典zz
  8. Linux Kernel ‘kvm_set_memory_region()’函数本地提权漏洞
  9. 在SQL中修改数据库名称
  10. 纯CSS3实现常见多种相册效果
  11. MyBatis中的大于、小于、like等符号写法
  12. TCP/IP 协议栈 -- 编写UDP客户端注意细节
  13. LoadXml 加载XML时,报错:“根级别上的数据无效。 行1,位置1“
  14. LOJ#2720 你的名字
  15. Sublime text 3 For LINUX 注册方法&关闭更新提示
  16. 【科普】GSM伪基站 劫持 诈骗?用4G网就安全?想强制用4G?最详细的科普教程在此!
  17. 微软BI 之SSIS 系列 - 数据仓库中实现 Slowly Changing Dimension 缓慢渐变维度的三种方式
  18. 安卓读写INI文件 安卓读写INI文件
  19. http_build_query用法,挺方便的
  20. [RN] 01 - Init: Try a little bit of React Native

热门文章

  1. windows和linux双系统删除linux
  2. IE6与W3C标准的盒模型差异
  3. Python开发【第十三篇】:jQuery(二)
  4. Apache本地环境下出现循环重定向
  5. php获得访问来源(手机wap访问、电脑web访问)
  6. Lambda表达式转SQL语句类库
  7. Activity和Fragment生命周期变化
  8. 补充一下sql server(临时表)
  9. ip接口调用
  10. 文字排版--斜体(font-style)