java的this关键词

来源:互联网 发布:windows bat脚本sleep 编辑:程序博客网 时间:2024/05/17 01:55

一.this调用构造方法

构造方法之间的相互调用需要使用this关键词

1.构造方法调用格式

this(参数列表);

2.构造方法的调用

class Person {// Person的成员属性private int age;private String name;// 无参数的构造方法Person() {}// 给姓名初始化的构造方法Person(String n) {name = n;}// 给姓名和年龄初始化的构造方法Person(String n, int a) {// 由于已经存在给姓名进行初始化的构造方法 name = n;因此只需要调用即可// 调用其他构造方法,需要通过this关键字来调用this(n);// 给年龄初始化age = a;}}


二.this原理图解

解释为什么就知道this调用的是哪个构造方法

class Person {private int age;private String name;Person() {}Person(String nm) {name = nm;}Person(String nm, int a) {this(n);age = a;}}class PersonDemo {public static void main(String[] args) {Person p = new Person("张三", 23);}}

1.上图解释:

(1)先执行main方法,main方法压栈,执行其中的new Person(“张三”,23);

(2)堆内存中开辟空间,并为其分配内存地址0x33,,紧接着成员变量默认初始化(name=null  age = 0);

(3)拥有两个参数的构造方法(Person(String nm , int a))压栈,在这个构造方法中有一个隐式的this,因为构造方法是给对象初始化的,那个对象调用到这个构造方法,this就指向堆中的那个对象。

(4)由于Person(String nm , int a)构造方法中使用了this(nm);构造方法Person(String nm)就会压栈,并将“张三”传递给nm。在Person(String nm , int a)构造方法中同样也有隐式的this,this的值同样也为0x33,这时会执行其中name = nm,即把“张三”赋值给成员的name。当赋值结束后Person(String nm , int a)构造方法弹栈。

(5)程序继续执行构造方法(Person(String nm , int a)中的age = a;这时会将23赋值给成员属性age。赋值结束构造方法(Person(String nm , int a)弹栈。

(6)当构造方法(Person(String nm , int a)弹栈结束后,Person对象在内存中创建完成,并将0x33赋值给main方法中的p引用变量。

2.注意

(1)this代表的是对象;哪个对象调用了this所在的方法,this就代表哪个对象

(2)调用其他构造方法的对象必须定义在构造方法的第一行(因为初始化动作要最先执行)


三.成员变量与局部变量同名的问题

这是this的另一个用途:

当方法中出现了成员变量和局部变量同名的时候,可以通过在成员变量名前面添加this.来区分成员变量与局部变量

class Person {private int age;private String name;// 给姓名和年龄初始化的构造方法Person(String name, int age) {// 当需要访问成员变量是,只需要在成员变量前面加上this.即可this.name = name;this.age = age;}public void speak() {System.out.println("name=" + this.name + ",age=" + this.age);}}class PersonDemo {public static void main(String[] args) {Person p = new Person("张三", 23);p.speak();}}