第十三章-面向对象(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关键字否则在调用的时候它怎么知道调用哪个对象的中的属性呢?
应用场景
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);
}
}