最新消息:XAMPP默认安装之后是很不安全的,我们只需要点击左方菜单的 "安全"选项,按照向导操作即可完成安全设置。

Java基础教程:this关键字原理和this调用构造方法

XAMPP相关 admin 86浏览 0评论

this调用构造方法

我们知道方法之间是可以相互调用的,那么构造方法之间能不能相互调用呢?针对构造方法,无法通过构造方法名来相互调用,但可以通过this关键字来完成。
构造方法调用格式:
this(参数列表);

构造方法的调用

class Person {
  // Person的成员属性
  private int age;
  private String name;

  // 无参数的构造方法
  Person() {
  }

  // 给姓名初始化的构造方法
  Person(String nm) {
    name = nm;
  }

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

this的原理图解

构造方法之间是可以相互调用,那为什么他们之间通过this就可以调用呢?接下来需要图解完成。

class Person {
  private int age;
  private String name;

  Person() {
  }
  Person(String nm) {
    name = nm;
  }
  Person(String nm, int a) {
    this(nm);
    age = a;
  }
}

class PersonDemo {
  public static void main(String[] args) {
    Person p = new Person("张三", 23);
  }
}

et0009

图列说明:

  1. 先执行main方法,main方法压栈,执行其中的new Person(“张三”,23);
  2. 堆内存中开辟空间,并为其分配内存地址0×33,,紧接着成员变量默认初始化(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的值同样也为0×33,这时会执行其中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对象在内存中创建完成,并将0×33赋值给main方法中的p引用变量。

注意:

this到底代表什么呢?this代表的是对象,具体代表哪个对象呢?哪个对象调用了this所在的方法,this就代表哪个对象。

调用其他构造方法的语句必须定义在构造方法的第一行,原因是初始化动作要最先执行。

成员变量和局部变量同名问题

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();
  }
}

转载请注明:XAMPP中文组官网 » Java基础教程:this关键字原理和this调用构造方法