Bootstrap

JAVA this关键字详解

this关键字是Java面向对象中很常用的关键字,可用于任何实例方法内指向当前对象,页可以指向对其调用当前方法的对象,或者在需要当前类型对象引用时使用。

this.属性名

大部分时候,普通方法访问其他方法、成员变量时无需使用this关键字,但是如果方法里面有个局部变量和成员变量同名,但程序又需要在该方法里面访问这个被覆盖的成员变量,则必须使用this前缀。

代码演示

public class demo04This {

    private String name;
    private double money;
    private int age;

    // 等号左边的 this.name 是指当前对象具有的变量 name,
    // 等号右边的 name 表示参数传递过来的数值。
    // 在构造方法中传递参数进行修改
    public demo04This(String name, double money, int age) {
        this.name = name;
        this.money = money;
        this.age = age;
    }

    public static void main(String[] args) {
        demo04This person = new demo04This("shuyv",999,18);
        System.out.println("-------------个人信息");
        System.out.println(person.name + " " + person.money + " " + person.age);
    }

}

当一个类的属性(成员变量)和访问该属性的方法名相同时,则需要使用this关键字来访问类中的属性,以区分类的属性和方法中的参数。


this.方法名

this关键字最大的作用就是让类中的一个方法,访问该类的另一个方法或者实例变量。

先演示一段代码:

我们在一个类当中定义俩个实例方法

public class demo06Tiger {

    // 定义一个jump方法
    public void jump() {
        System.out.println("jump方法已执行");
    }

    // 在run方法内执行jump方法
    public void run() {
    	System.out.println("run方法已经执行");
        // 实例化tiger对象,通过该对象来访问jump方法
        demo06Tiger tiger1 = new demo06Tiger();
        tiger1.jump();
    }

}

然后在另一个类中去调用run方法

public class demo07TigerTest {

    public static void main(String[] args) {
        demo06Tiger tiger2 = new demo06Tiger();
        tiger2.run();
    }

}

执行结果:
run方法已经执行
jump方法已经执行

注意事项:
在run方法中调用jump方法,必须要实例化一个对象来进行访问。因为没有使用static关键字修饰的成员变量和方法必须使用对象来调用。

存在的问题
然后我们分析上面程序,在该程序中一共实例化了俩次,产生了俩个对象,在run方法中调用jump方法,通过tiger1对象实现。在另一个类的main方法中通过tiger2对象实现调用run方法。
this关键字便可以解决该问题,因为当程序调用run方法时,在run方法内部一定会创建一个tiger1对象,所以我们利用之后的方法调用利用tiger1对象来实现就OK了,无需再实例化新的对象,
因为每一次实例化新的对象,就会占用内存。

提示:
this可以代表任何对象,当this出现在某个方法体中时,它所代表的对象是不确定的,但是所代表的类型却是确定的,因为它只能代表当前类。所以说,只有这个方法被调用的时候,this代表的对象才会被确定下来,谁在调用该方法,this就指向谁,就代表谁。

下面我们使用this关键字对上面run方法进行修改
代码演示:

    public void run() {
        // 实例化tiger对象,通过该对象来访问jump方法
        // demo06Tiger tiger1 = new demo06Tiger();
        // tiger1.jump();
        System.out.println("run方法已经执行");
        this.jump();
    }

改过之后的区别就是在run方法中调用jump方法没有通过实例化来进行访问,而是使用this关键字。

注意区别:之前我们通过tiger2对象调用run方法,在run方法内部又通过tiger1对象调用jump方法,就是说,一个对象的run方法依赖于另一个对象的jump方法,形象一点就是你想让老虎2又跑又跳,但前面的做法确是老虎2跑了,但跳的确是老虎1,你说傻B不傻B,是不是很不符合逻辑。
现在我们通过tiger2对象调用run方法,但是run方法内部使用this关键子,注意this关键字,上面我们已经说过,this在方法中不一定可以代表具体的对象,但是一定可以代表具体的类,谁调用了this所在的方法,this就代表谁,所以我们这边的老虎2执行了跑方法,this关键字在跑方法中,this就指向老虎2,那么现在很符合逻辑,老虎2既跑又跳。

总结:

在开发过程中,对象的一个方法依赖于另一个的情形很常见,比如,程序媛对象设计程序的方法就依赖于敲键盘方法,等等。但注意,这种依赖关系都只针对一个对象。因此Java允许对象的一个成员方法直接调用另一个成员方法,可以省略this关键字前缀。
就是说改成下面这样的形式也没毛病,效果一样。

    public void run() {
        // 实例化tiger对象,通过该对象来访问jump方法
        // demo06Tiger tiger1 = new demo06Tiger();
        // tiger1.jump();
        System.out.println("run方法已经执行");
        jump();
    }

this( )访问构造方法

注意:

  • 1.this()不可以在普通方法中使用,只能写在构造方法中。
  • 2.在构造方法中使用时,必须是第一条语句。

代码演示:

public class Person {

    String name;    // 名字属性

    public Person(String name) {
        this.name = name;   // 实例化属性
    }

    public Person() {
        this("James");
    }

    public void output() {
        System.out.println("James' name is " + name);
    }

    public static void main(String[] args) {
        Person James = new Person();
        James.output();
    }

}
;