JAVA_SE基础——31.this关键字

黑马程序员入学blog...


也算是学习笔记体会。


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关键字来解决就可以了。


先给大家看看内存图估计就懂了

JAVA_SE基础——31.this关键字_第1张图片

下面看我用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在构造函数中调用其他构造函数的时候,只能定义在构造函数的第一行,因为初始化动作要先执行,否则就会报错。





你可能感兴趣的:(java,对象,this关键字)