java的学习:this关键字

一、什么是this关键字?

当你调用一个对象的方法时,如果这个方法中有this,那么在你调用时,this就会生成一个对于这个对象的引用。简单点来说,this可以理解为当前对象

二、this关键字的使用(注意:this关键字只能在非静态方法内部使用)

this关键字可以用来调用属性(成员变量)方法构造器

2.1 this关键字调用属性(this.属性)

class Person{
    private String name;

    public Person() {
    }

    public String getName() {
        return name;
    }

    public void setName(String name) {
        //name=name;
        this.name = name;
    }
}

在setter方法中,形参名name与成员变量名name相同,这样会引起混淆。这时就可以通过this.name来表明指向的是成员变量name,避免了重复。

2.2 this关键字调用方法(this.方法)

public class Demo {
    public static void main(String[] args) {
        Person p1=new Person();
        p1.setName("小钻风");
        p1.speak();

    }
}

class Person{
    private String name;

    public Person() {
    }

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    public void speak(){
        //当然此处this都可省略,效果一样
        System.out.println(this.name+":大王叫我来巡山,");
        this.run();
    }

    public void run(){
        System.out.println("我把人间转一转");
    }
}

输出:

小钻风:大王叫我来巡山,
我把人间转一转

在speak()方法中,可以通过this.name获取name值,也可以通过this.run()来调用run()方法,当然,这里的this都是可以省略的。在此处你可以使用this,但是一般是没有必要的。通过查看编译后的.class文件就会发现,当你不使用this时,编译器会帮你自动的应用上。

2.3 this调用构造器(this(参数列表))

在一个类中如果有多个构造器,这时就可能会出现一些代码重复。想要避免这些代码的重复,这时就可以通过this(参数列表)来实现,如此就会显式的调用与其参数列表相匹配的构造。注意:通过this调用构造器必须声明在当前构造器的首行

class Person {
    private String name;
    private int age;

    public Person() {
        System.out.println("空参构造");
    }

    public Person(String name) {
        this();
        this.name = name;
        System.out.println("参数为name的构造");
    }

    public Person(int age) {
        this.age = age;
    }

    public Person(String name, int age) {
        this(name);
        this.age = age;
        System.out.println("两个参数的构造");
    }
}


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

输出:

空参构造
参数为name的构造
两个参数的构造

2.4 用在return语句中返回对当前对象的引用

class Person{
    private String name;
    private int num=0;

    public Person() {
    }

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    public void speak(){
        //当然此处this都可省略,效果一样
        System.out.println(this.name+this.num+"号:大王叫我来巡山,");
        this.run();
    }

    public void run(){
        System.out.println("我把人间转一转");
    }

    public Person num(){
        num++;
        System.out.println(num);
        return this;
    }

}

public class Demo {
    public static void main(String[] args) {
        Person p1=new Person();
        p1.setName("小钻风");
        p1.speak();
        System.out.println("====================");
        p1.num().num().speak();

    }
}

输出:

小钻风0:大王叫我来巡山,
我把人间转一转
====================
1
2
小钻风2:大王叫我来巡山,
我把人间转一转

因为num()方法返回的是this,而this就是当前对象的引用。因此这里p1.num().num().speak();都是同一个对象在操作,所以输出的num才会不断的累加。

2.5 使用this向其他对象传递当前对象

class Person {
    void eat(Food food) {
        Food cooked = food.getCooked();
        System.out.println(food.getExtent());
    }
}

class Food {
    //程度
    String extent;

    String getExtent() {
        return extent;
    }

    void setExtent(String extent) {
        this.extent = extent;
    }

    Food getCooked() {
        extent = "生的";
        return FoodUtils.cook(this);
    }
}

class FoodUtils {
    static Food cook(Food food) {
        System.out.println(food.getExtent());
        System.out.println("开始做饭");
        food.setExtent("已烧熟");
        return food;
    }
}

public class Demo {
    public static void main(String[] args) {
        Person p1 = new Person();
        p1.eat(new Food());

    }
}

输出:

生的
开始做饭
已烧熟

Food要调用外部工具类FoodUtis中的方法做一些操作,这里就需要使用this将其自身传给外部方法。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章