第十三章-面向对象(this关键字)

-使用场景一&this的原理图解

public class Person {

	private String name;
	
	 /*  如果写成这样阅读性非常差不知道a是什么意思.如果将a写成name 当构造方法
	  *  进栈的时候相当于将name的值又从新赋值一次,但是成员变量的name属性并没有得到该构造函数赋给的值,
	  *  构造函数中赋值就成了自己给自己又赋值了一次.相当于 int x = 3; x=x;
	  *  这个时候this关键字出现了用来解决着个问题  
	  *  当局部变量和成员变量重名时,可以使用this来区分
	  *  
	  *  this:代表对象,代表当前对象
	  *       this就是所在函数所属对象的引用
	  *       简单说:哪个对象调用了this所在函数,this就代表哪个对象
	*/
	 Person(String name) {
		 name=name;
	}
	 
	 public void speak(){
		 System.out.println(name);
	 }
	 
	
	 public static void main(String[] args) {
		
		Person p = new Person("Quinn");
		p.speak();
	}
}

 

-内存分析

构造函数在给对象赋值的时候,怎么确保出现多个new Person("旺财") new Person("小明"),能正确的赋值正确呢? 答案是,在每次出现new Person()对象时候,调用相应构造函数给对象初始化操作时候,其实构造函数中有个隐藏的this关键字 (this也是有引用存在的)谁调用该构造函数在堆中创建了对象,构造函数中的this就通过引用指向创建对象的地址,在执行构造函数里面内容的时候,发现this.name(代表引用指向的所在堆中的相应地址)并进行赋值,然后弹栈.
第十三章-面向对象(this关键字)
 
第十三章-面向对象(this关键字)
 
第十三章-面向对象(this关键字)
 

其实普通函数中也有this关键字否则在调用的时候它怎么知道调用哪个对象的中的属性呢?
第十三章-面向对象(this关键字)
 
第十三章-面向对象(this关键字)
 

应用场景

public class Person {

	private String name;
	private int age;
	
	 Person(String name) {
		 this.name=name;
	}
	 /**对this的调用必须是构造函数的第一行因为初始化动作要先执行*/
	 Person(String name,int age) {
		 this(name);
		 this.age=age;
	}
	 
	 public void speak(){
		 System.out.println(name+age);
	 }
	 
	 public static void main(String[] args) {
		
		Person p = new Person("Quinn",10);
		p.speak();
	}
}

 

this基本应用

public class Person {

	private String name;
	private int age;
	
	 Person(String name,int age) {
		 this.age=age;
	}
	 
	 //this谁调用它,它代表谁,this代表p1
	 public void compare(Person p){
		System.out.println(this.age>p.age ? this.age:p.age);
	 }
	 
	 public static void main(String[] args) {
		
		Person p1 = new Person("Quinn",5);
		Person p2 = new Person("Quinn",7);
		
		p1.compare(p2);
		
	}
}