this关键字
|
this作用:this持有对象对内存地址 1代指对象2用于构造函数调用构造函数代指对象 |
![]() |
|
一、this原理与图解 |
|
【】this.name,意思是这个对象的name 【】this不是对象,只是代表对象,准确的说,this指向对象 this持有的是在堆内存的对象的地址,this就像个引用型变量似的存储堆内存对象的内存地址,this指向堆内存对象
|
![]() |
|
【】this不代表栈内存对象p,而是指向堆内存的对象 |
|
【】凡是被对象调用的方法,内部都持有一个this引用。 【】准确的说,对象调用构造函数时,对象会给构造函数一个this,this里面有该对象的堆内存地址 例如构造函数里面就有this,那个对象调用构造函数就给那个对象初始化。给那个对象初始化呢?Person构造函数加载进栈内存后,它里面的this就持有一个调用它的对象的堆内存地址的引用,这个this指向哪个对象就给哪个对象初始化。 【】Person()一进内存,this就立刻有对象的堆内存地址值了
|
|
【】this内部持有堆内存对象的内存地址,this指向了这个对象。this.name就代表内存0045中的name,也就是对象的name变量
【】main进栈,变量p开辟空间;堆内存对象建立,内存地址确定,里面有成员变量name和age, 【】调用构造函数Person()进栈,Person里面参数列表变量开辟空间。旺财传给person里面参数变量name。 进栈的函数持有this,this内有对应对象的堆内存地址值,this指向堆内存,参数变量name将旺财通过this持有的地址传到堆内存对象处的name。 【】Person()弹栈 【】对象堆地址赋给变量p
【】之后speak()进栈,自动持有this,堆内存对象将内存地址赋给this,speak也能够指向对象了
【】之后,main里面出现第二个变量p1,构造函数Person()进栈,自动持有this内存地址指向第二个对象,参数变量name=小强,然后通过this的地址赋给他指向的对象里的name。然后Person再弹栈。 【】speak函数再被调用进栈,应该是this.name和this.age被打印出来,就是对象的成员变量被打印出来。 毕竟this.name通俗解释就是对象的name
|
|
【】其实类里面很多函数里面的成员变量前都省略了this.,成员变量前加上this.才是完整正确的格式。所有进栈的函数里面都有this 不省略this写上也没错,但按照标准应该写上。只不过没有重名,没必要写上。
【】就像毕老师,标准叫法是传智的毕老师,单独见不用加传智的,但如果和央视的毕老师一起碰见,则应该加上传智的毕老师,才能区分。 一般所有入站函数都应该写出this,但是由于一些变量显而易见是成员变量与之不产生误解,所以默认省略this也可以。但如果变量并不显而易见是成员变量且容易产生误解,就应该加上this。明确变量是成员变量,或者说是这个对象的成员变量。 |
| 二、构造函数调用另一个构造函数 |
|
【】构造函数可以直接调用一般函数,但一般函数不能直接调用构造函数,想要调用先创建对象----new person().构造函数 【】构造函数如何访问构造函数呢? 【】一个类中它的所有成员只要想运行,都必须要有对象调用。貌似构造器调动另一个构造器应该写成应该写成this.Person() 但是,Person()是给对象初始化的,this还没有初始化(对象没有初始化就没法使用),如何能调用其中的方法呢?这样写逻辑冲突。 所以写法为this(),给this所持的那个对象初始化。
【】一个类中构造函数想要调用另一个构造函数,必须指明引用,加this。引用另一个构造函数写法,this(),或this(n),或者this(m,n) |
|
【】一个类中的成员想要被执行,就必须要有对象去调用,就是说前面必须有this。 其实一个次函数调用另一个次函数,也省略了this。
|
|
【】this=类名,所以this(name)=Person(name),构造函数区分通过参数列表来完成,里面只有 |
|
【】main进栈,p变量开辟空间,Person对象进堆,两个成员变量name,age开辟空间,初始化为null和0; 【】对象的构造函数部分进栈执行,this指向堆内存对象,构造函数调用另一个构造函数this(name),则另一构造函数进栈, 【】name=旺财,之后构造函数弹栈,age=30,构造函数弹栈, |
|
【】构造函数引用其他构造函数时,引用的构造函数必须在第一行,因为放到后面怕自己的初始化代码被引用的构造函数覆盖掉。 引用的构造函数初始化先执行,后面就不担心自己初始化再被覆盖。 |
|
【】不要出现相互调用情况,会导致栈内存疯狂循环溢出。 相互调用,你调我,我再调你,你再调我,构造函数不断进栈,没人出栈,最后程序停止。
|
| 三、this引用的变量 |
| 【】只要在本类中用到了本类的对象,通常都用this代替类名,因为this代表本类对象 |
|
|
|
在类里面定义一个函数,比较两个对象的年龄 【】本对象调用自己类里面的函数,去和另一个对象比较,则该函数接收另一个对象的参数, 则本对象使用this代指本对象, 【】只要在本类中用到了本类的对象,通常都用this代替 |


















浙公网安备 33010602011771号