第2章this关键字

1.1 this调用构造方法

在之前学习方法之间调用时,可以通过方法名进行调用。可是针对构造方法,无法通过构造方法名来相互调用。

构造方法之间的调用,可以通过this关键字来完成。

  • 构造方法调用格式:

      this(参数列表);

 

  • 构造方法的调用

class Person {

  // Person的成员属性

    privateintage;

    private String name;

  // 无参数的构造方法

    Person() {

      }

   // 给姓名初始化的构造方法

    Person(String nm) {

      name = nm;

      }

  // 给姓名和年龄初始化的构造方法

    Person(String nm, int a) {

  // 由于已经存在给姓名进行初始化的构造方法 name = nm;因此只需要调用即可

  // 调用其他构造方法,需要通过this关键字来调用

        this(nm);

   // 给年龄初始化

        age = a;

    }

}

2.1 this的原理图解

了解了构造方法之间是可以相互调用,那为什么他们之间通过this就可以调用呢?

通过上面的学习,简单知道使用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);

      }

}

 

  • 图列说明:

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

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

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

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

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

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

  • 注意:

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

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

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

通过上面学习,基本明确了对象初始化过程中的细节,也知道了构造方法之间的调用是通过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();

    }

}

2.4 this的应用

学习完了构造方法、this的用法之后,现在做个小小的练习。

需求:在Person类中定义功能,判断两个人是否是同龄人

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

}

 

    // 判断是否为同龄人

      public boolean equalsAge(Person p) {

    // 使用当前调用该equalsAge方法对象的age和传递进来page进行比较

    // 由于无法确定具体是哪一个对象调用equalsAge方法,这里就可以使用this来代替

        /*

         * if(this.age == p.age) { return true; } return false;

         */

      return this.age = p.age;

    }

}

posted @ 2018-09-01 10:35  🍪  阅读(128)  评论(0编辑  收藏  举报