Java - [面向对象]this

2020/03/01

本文梳理下this的几种使用场景:

方法中的this

假设定义一个Dog类,其中的run()方法需要调用它的jump()方法,应该怎么办?

public class Dog {

    public void jump(){
        System.out.println("Start jumping");
    }

    public void run(){
        jump();
        System.out.println("Start running");
    }
}

@Test
void thisTest(){
    Dog dog = new Dog();
    dog.run();
    // Dog start jumping
    // Dog start running
}

有没有想过这样一个问题:

实例方法不是只能被对象调用吗?为什么run()方法中可以直接调用jump()?

其实上面的jump(),完整版应该是this.jump()Java允许对象的一个成员直接调用另一个成员,因此可以省略this前缀。

而这个省略的this其实代表调用run()这个方法的对象,就是dog

再来一个特殊的场景:

如果方法中的局部变量类中的实例成员变量同名怎么办?

public class Dog {

    private final String name = "puppy";

    public void getName(){
        String name = "abc";
        System.out.println("The name of dog is " + name);
    }
}

@Test
void thisTest(){
    Dog dog = new Dog();
    dog.getName();
    // The name of dog is abc
}

可以看到:方法中的局部变量覆盖了类中的实例成员变量

如果我就想访问类实例成员变量,应该怎么办?

public class Dog {

    private final String name = "puppy";

    public void getName(){
        String name = "abc";
        System.out.println("The name of dog is " + this.name);
    }
}

@Test
void thisTest(){
    Dog dog = new Dog();
    dog.getName();
    // The name of dog is puppy
}

答案就是使用this

重新理解下这句话: 方法中的this代表调用该方法的对象

那么上面的this在哪个方法中?

谁调用的getName()方法?

所以dog.name是什么?

puppy

构造器中的this

构造器中的this代表什么?

构造器正在初始化的对象

举个例子:

@Getter
public class Dog {

    private String name;

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

@Test
void thisTest(){
    Dog puppy = new Dog("puppy");
    System.out.println("The name of dog is " + puppy.getName());
    // The name of dog is puppy
}

Reference

  • 《疯狂Java讲义》 - 5.1.4 对象的this引用


一位喜欢提问、尝试的程序员

(转载本站文章请注明作者和出处 姚屹晨-yaoyichen

Post Directory