【阿里云】Java面向对象开发课程笔记(五)——this关键字

1 this关键字

  this的实际使用可以做三件事:调用本类属性、调用本类方法(普通、构造)、表示当前对象(相对概念)

1.1 this调用本类属性

范例:观察如下程序

代码

class Person{
    private String name;
    private int age;
    // setter、getter、无参构造略
    public Person(String n,int a){
        name = n;
        age = a;
    }
    public String getInfo(){
        return "name : " + name + ", age : " + age ;
    }
}
public class ThisDemo {
    public static void main(String args[]){
        System.out.println(new Person("zhangsan",20).getInfo());
    }
} // name : zhangsan, age : 20

  但是给出的参数存在问题,当前类的构造方法的核心目的在于:为类中的name和age属性初始化。但是构造方法的参数声明不准确(String n,int a),最好的方法是将参数的名称与属性名称统一起来。
  这个时候可能会产生参数与属性同名的问题,为了明确标记处要使用的是属性还是方法的参数,那么属性前都统一加上“this”的形式。
范例:属性前加“this”

代码

class Person{
    private String name;
    private int age;
    public Person(String name,int age){
      // this.属性:表示当前对象中的属性,这样就不会与方法中的参数名称混淆。
        this.name = name;
        this.age = age;
    }
    public String getInfo(){
        return "name : " + this.name + ", age : " + this.age ;
    }
}
public class ThisDemo {
    public static void main(String args[]){
        System.out.println(new Person("zhangsan",20).getInfo());
    }
} // name : zhangsan, age : 20

  只要在类的方法中访问有类的属性,就要加“this”关键字。

1.2 this调用本类方法

  类的方法一共有两种:

  • 普通方法:this.方法名称(参数…);
  • 构造方法:this(参数…);

范例:调用本类普通方法

代码

class Person{
    private String name;
    private int age;
    public Person(String name,int age){
              this.name = name;
              this.age = age;
         // 问题是不使用this也可以调用
              this.print(); // 调用本类方法
    }
    public void print(){
               System.out.println("*************************");
}
    public String getInfo(){
        return "name : " + this.name + ", age : " + this.age ;
    }
}
public class ThisDemo {
    public static void main(String args[]){
        System.out.println(new Person("zhangsan",20).getInfo());
    }
}

输出结果

*************************
name : zhangsan, age : 20

  虽然调用本类方法前可以不使用this,但是建议使用,目的是区分方法的定义来源。
构造方法与普通方法的最大区别:使用关键字new实例化类新对象的时候使用一次,而普通方法是在对象实例化完成后(构造方法已经执行过了)可以调用多次。
  在Java中支持类构造方法的互相调用。
范例:观察构造方法存在的问题

代码

class Person{
    private String name;
    private int age;
    // 要求不管调用哪个构造方法,都要执行一个信息输出
    public Person(){ // 无参构造
        System.out.println("*****一个新的Person类对象产生*****");
    }
    public Person(String name){
        System.out.println("*****一个新的Person类对象产生*****");
        this.name = name;
    }
    public Person(String name,int age){
        System.out.println("*****一个新的Person类对象产生*****");
        this.name = name;
        this.age = age;
    }
    public String getInfo(){
        return "name : " + this.name + ", age : " + this.age ;
    }
}
public class ThisDemo {
    public static void main(String args[]){
        System.out.println(new Person().getInfo());
        System.out.println(new Person("zhangsan").getInfo());
        System.out.println(new Person("zhangsan",20).getInfo());
    }
}

输出结果

*****一个新的Person类对象产生*****
name : null, age : 0
*****一个新的Person类对象产生*****
name : zhangsan, age : 0
*****一个新的Person类对象产生*****
name : zhangsan, age : 20

  存在代码重复,必须消除掉重复代码,使用“this”。
范例:使用this解决问题

代码

class Person{
    private String name;
    private int age;
    // 要求不管调用哪个构造方法,都要执行一个信息输出
    public Person(){ // 无参构造
        System.out.println("*****一个新的Person类对象产生*****");
    }
    public Person(String name){
        this(); // 调用本类中无参构造
        this.name = name;
    }
    public Person(String name,int age){
        this(name); // 调用本类中有参构造
       // this.name = name;
        this.age = age;
    }
    public String getInfo(){
        return "name : " + this.name + ", age : " + this.age ;
    }
}
public class ThisDemo {
    public static void main(String args[]){
        System.out.println(new Person().getInfo());
        System.out.println(new Person("zhangsan").getInfo());
        System.out.println(new Person("zhangsan",20).getInfo());
    }
}

输出结果

*****一个新的Person类对象产生*****
name : null, age : 0
*****一个新的Person类对象产生*****
name : zhangsan, age : 0
*****一个新的Person类对象产生*****
name : zhangsan, age : 20

  虽然使用this可以实现构造方法的互相调用,但有两点要求:

  • this()调用构造方法的语句必须放在构造方法的首行;
  • 使用this()调用构造方法的时候请留有出口,避免递归调用构造器。

1.3 this表示当前对象

  在一个类中肯定会产生若干个对象,那么程序类在分辨的时候不会记住具体有多少个对象产生,它唯一可能知道的是,当前操作本类的对象是哪一个。
范例:观察当前对象

代码

class Person{
    public void fun(){
        System.out.println(" [fun] " + this);
    }
}
public class ThisDemo {
    public static void main(String args[]){
        Person p1 = new Person();
        System.out.println(" [main] " + p1);
        p1.fun(); // 由p1这个对象调用了fun()方法(this = p1)
        System.out.println("=========================");
        Person p2 = new Person();
        System.out.println(" [main] " + p2);
        p2.fun();
    }
}

输出结果

[main] Person@1540e19d
[fun] Person@1540e19d
=========================
[main] Person@677327b6
[fun] Person@677327b6

  在整体操作过程中,this定义没有变,只要有某一个对象调用了本类中的方法,那么这个this就表示当前执行的对象。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值