学习笔记体会。
this的通俗解释:
有一个A类,一个B方法,一个C变量,其中B和C都在类A中
this.B()就是调用A类中的B方法
this.C=1(假设C是一个int变量)就是给类A的C变量赋了1这个值
简单的说就是调用本类的方法或者变量(都是成员的)
需求: 使用java类描述一个动物。
class Animal{ String name = "狗"; //成员变量 //this关键字代表了所属函数的调用者对象 public void eat(){ //System.out.println("this:"+ this); String name = "老鼠"; //局部变量 System.out.println(name+"在吃..."); //需求: 就要目前的name是成员变量的name. } } class Demo6 { public static void main(String[] args) { Animal a = new Animal(); //现在在内存中存在两份name数据。 a.eat(); } }
运行结果是:
老鼠在吃...
为何是老鼠在吃呢 而不是狗在吃
因为存在同名的成员变量与局部变量时,在方法的内部访问的是局部变量(java 采取的是就近原则的机制访问的。)。
那么问题就来了???
需要解决这种同类同变量名时怎么区分并且调用?
用this关键字来解决就可以了。
先给大家看看内存图估计就懂了
下面看我用this关键字来解决上面的问题。
class Animal{ String name ; //成员变量 public Animal(String name){ this.name = name; } //this关键字代表了所属函数的调用者对象 public void eat(){ //System.out.println("this:"+ this); String name = "老鼠"; //局部变量 System.out.println(this.name+"在吃..."); //需求: 就要目前的name是成员变量的name. System.out.println(this); } } class Demo6 { public static void main(String[] args) { Animal dog = new Animal("狗"); //现在在内存中存在两份name数据。 Animal cat = new Animal("猫"); dog.eat(); cat.eat(); } }
运行结果:
狗在吃...
Animal@15db9742
猫在吃...
Animal@6d06d69c
上面有两句内存地址 就说明了第一次调用了函数和第二次调用了函数的对象是不同的(第一次是dog,第二次是cat),这就区分了 两个对象分别调用变量而不混淆的好处了。。
如果这样都不理解的话,可以这样认为this关键字代表了所属函数的调用者对象。 例如 第一次调用:
(this.name+"在吃...");
可以看成
(dog.name+"在吃...");
dog变量地址是Animal@15db9742 然后就去Animal对象找name的值 以此类推。
(个人观点)this我认为最主要特点是:区分成员变量和局部变量的名称冲突,哪个对象调用了this所在的函数,this就代表哪个对象
this关键字代表了所属函数的调用者对象。
this代表其所在函数所属对象的引用。换言之,this代本类对象的引用。
当成员变量和局部变量重名,可以用关键字this来区分,this就是所在函数所属对象的引用。
简单说,哪个对象调用了this所在的函数,this就代表哪个对象。一般方法调用默认加this。
什么时候使用this关键字呢?
当在函数内需要用到调用该函数的对象时,就用this。
P.S.
通过this在构造函数中调用其他构造函数的时候,只能定义在构造函数的第一行,因为初始化动作要先执行,否则就会报错。