Java this关键字详解

创建对象的过程

创建对象的过程分为四步:

  1. 分配对象空间,并将对象的成员变量初始化为0或空
  2. 执行属性的显式初始化
  3. 执行构造方法
  4. 返回对象的地址给相关的变量

this的本质

this的本质就是“创建好的对象的地址”,由于在构造方法调用前,对象已经创建,因此,在构造方法中也可以使用this代表“当前对象”

注意:
this不能用于static方法中

调用构造器

public class TestThis {
    int a, b, c;

    TestThis(int a, int b) {
        this.a = a;
        this.b = b;
    }

    TestThis(int a, int b, int c) {
        this(a,b); //调用构造器,不能使用TestThis(a,b),而且必须放在构造方法的第一行代码
       this.c = c;
    }

    void sing() {
    }

    void eat() {
        this.sing(); //调用本类中的sing();
        System.out.println("你妈妈喊你回家吃饭咯!");
    }


    public static void main(String[] args) {
        TestThis hi = new TestThis(2, 3);
        hi.eat();

    }
}

输出结果:

你妈妈喊你回家吃饭咯!

this关键字最常用的用法

java中,this关键字一般有以下三种用法:

  • this.属性:代表本类属性

  • this调用本类方法:代表调用本类方法

  • this:代表当前对象

针对这三种用法,分别结合代码来进行说明

代表本类属性

先来一段没有使用this的代码:

public class ThisTest1 {

    public static void main(String[] args) {
        ThisDemo thisDemo = new ThisDemo("李四", "杭州");
        System.out.println(thisDemo.get());
    }
}

class ThisDemo {

    private String name;

    private String address;

    public ThisDemo(String n, String a) {
        name = n;
        address = a;
    }

    public String get() {
        return "名字:" + name + ", 地址:" + address;
    }
}

输出结果:

名字:李四, 地址:杭州

我们可以看下上面代码ThisDemo类的构造方法中两个形参n和a,这种参数命名没有意义,代码维护性比较差,这两个参数目的是为了给属性name和address初始化赋值用的,那么构造方法的这两个参数名称最好也是name和address

修改构造方法的形参名称,代码如下:

public class ThisTest1 {

    public static void main(String[] args) {
        ThisDemo thisDemo = new ThisDemo("李四", "杭州");
        System.out.println(thisDemo.get());
    }
}

class ThisDemo {

    private String name;

    private String address;

    public ThisDemo(String name, String address) {
        name = name;
        address = address;
    }

    public String get() {
        return "名字:" + name + ", 地址:" + address;
    }
}

输出结果为:

名字:null, 地址:null

上面的代码构造方法形参命名虽然有意义了,但输出结果不是我们想要的,属性name和address没有初始化值了。这是因为在java程序之中是以一对大括号”{}”来作为分界,采用就近原则。此时,可以使用this关键字来表示属性为类属性。

    public ThisDemo(String name, String address) {
        this.name = name;
        this.address = address;
    }

开发建议:只要是调用本类中的属性,都使用“this.属性”的方式来进行

代表调用本类方法

类方法分为两种:

  • 普通方法:如果调用本类的普通方法,可以使用“this.方法()”调用

  • 构造方法:如果调用本类的构造方法,可以使用”this(参数…)”调用

调用类的普通方法

这个比较简单,直接上代码:

public class ThisTest2 {

    public static void main(String[] args) {
        ThisDemo2 thisDemo = new ThisDemo2("李四", "杭州");
        System.out.println(thisDemo.get2());
    }
}

class ThisDemo2 {

    private String name;

    private String address;

    public ThisDemo2(String name, String address) {
        this.name = name;
        this.address = address;
    }

    public String get() {
        return "名字:" + name + ", 地址:" + address;
    }

    public String get2() {
        return this.get();
    }

}

输出结果为:

名字:李四, 地址:杭州

可以看到get2()方法中使用了this.get()调用本类的普通方法

调用类的构造方法

举例: 假如一个类中有三个构造方法(无参、一个参数、两个参数),代码如下:

public class ThisTest3 {

    public static void main(String[] args) {
        ThisDemo3 thisDemo = new ThisDemo3("李四", "杭州人间天堂");
        System.out.println(thisDemo.get());
    }

}

class ThisDemo3 {

    private String name;

    private String address;

    public ThisDemo3() {

        System.out.println("创建了一个新的ThisDemo3实例......");
    }

    public ThisDemo3(String name) {
        this.name = name;

        System.out.println("创建了一个新的ThisDemo3实例......");
    }

    public ThisDemo3(String name, String address) {
        this.name = name;
        this.address = address;

        System.out.println("创建了一个新的ThisDemo3实例......");
    }

    public String get() {
        return "名字:" + name + ", 地址:" + address;
    }

}

输出结果为:

创建了一个新的ThisDemo3实例......
名字:李四, 地址:杭州人间天堂

可以看到上面的代码有大量重复情况,那么我们这时候就可以使用this调用构造方法来简化我们的代码,让代码看起来清爽简洁。

public class ThisTest4 {
    public static void main(String[] args) {
        ThisDemo4 thisDemo = new ThisDemo4("李四", "杭州人间天堂");
        System.out.println(thisDemo.get());
    }

}

class ThisDemo4 {

    private String name;

    private String address;

    public ThisDemo4() {

        System.out.println("创建了一个新的ThisDemo4实例......");
    }

    public ThisDemo4(String name) {
        this();
        this.name = name;
    }

    public ThisDemo4(String name, String address) {
        this(name);
        this.address = address;

    }

    public String get() {
        return "名字:" + name + ", 地址:" + address;
    }

}

输出结果为:

创建了一个新的ThisDemo3实例......
名字:李四, 地址:杭州人间天堂

上面就是使用this调用构造方法的优化后的代码,没有重复代码,看起来简洁多了。

这里要注意的是:所有的构造方法都是在对象实例化的时候被默认调用,且是在调用普通方法之前,所以在使用this()调用构造方法,一定要放在构造方法的第一行

    public ThisDemo4(String name, String address) {
        this(name); //放在第一行
        this.address = address;

    }

代表当前对象

先了解下当前对象是代表啥意思?当前对象就是指当前正在调用类中方法的对象。

先看下代码:

public class ThisTest4 {
    public static void main(String[] args) {
        ThisDemo4 thisDemo = new ThisDemo4("李四", "杭州人间天堂");
        System.out.println(thisDemo);
        System.out.println(thisDemo.get());
    }

}

class ThisDemo4 {

    private String name;

    private String address;

    public ThisDemo4() {

        System.out.println("创建了一个新的ThisDemo4实例......");
    }

    public ThisDemo4(String name) {
        this();
        this.name = name;
    }

    public ThisDemo4(String name, String address) {
        this(name);
        this.address = address;

    }

    public String get() {

        System.out.println("当前对象this:"+this);
        return "名字:" + name + ", 地址:" + address;
    }

}

输出结果:

创建了一个新的ThisDemo4实例......
com.trc.java.ThisDemo4@8efb846
当前对象this:com.trc.java.ThisDemo4@8efb846
名字:李四, 地址:杭州人间天堂

可以看到,this其实就是当前创建的对象

评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值