面向对象(this关键字)

this是java里面一个关键字,是一种引用类型,在heap中每个java对象上都有一个this指向自己。this代表着当前对象引用。

this可以做什么?

可以区分成员变量和局部变量。

一.this的作用

1.this 相当于是指向当前对象本身

2.成员变量和局部变量同名问题

class Person {

    privateint age;

    private String name;

    // 给姓名和年龄初始化的构造方法Person(String name,int age) {

        // 当需要访问成员变量是,只需要在成员变量前面加上this.即可this.name = name;

        this.age = age;

    }

    publicvoid speak() {

        System.out.println("name=" +this.name + ",age=" +this.age);

    }

}class PersonDemo {

    publicstaticvoid main(String[] args) {

        Person p =newPerson("张三", 23);

        p.speak();

    }

}

3.调用构造函数

class Person {

    // Person的成员属性privateint age;

    private String name;

    // 无参数的构造方法    Person() {

    }

    // 给姓名初始化的构造方法    Person(String nm) {

        name = nm;

    }

    // 给姓名和年龄初始化的构造方法Person(String nm,int a) {

        // 由于已经存在给姓名进行初始化的构造方法 name = nm;因此只需要调用即可

        // 调用其他构造方法,需要通过this关键字来调用this(nm);

        // 给年龄初始化age = a;

    }

}


二.this原理图解

class Person {

    privateint age;

    private String name;

    Person() {

    }

    Person(String nm) {

        name = nm;

    }

    Person(String nm, int a) {

        this(nm);

        age = a;

    }

}class PersonDemo {

    publicstaticvoid main(String[] args) {

        Person p =newPerson("张三", 23);

    }

}

图例说明:

1、先执行main方法,main方法压栈,执行其中的new Person(“张三”,23);

2、堆内存中开辟空间,并为其分配内存地址0x33,,紧接着成员变量默认初始化(name=null  age = 0);

3、拥有两个参数的构造方法(Person(String nm , int a))压栈,在这个构造方法中有一个隐式的this,因为构造方法是给对象初始化的,那个对象调用到这个构造方法,this就指向堆中的那个对象。

4、由于Person(String nm , int a)构造方法中使用了this(nm);构造方法Person(String nm)就会压栈,并将“张三”传递给nm。在Person(String nm , int a)构造方法中同样也有隐式的this,this的值同样也为0x33,这时会执行其中name = nm,即把“张三”赋值给成员的name。当赋值结束后Person(String nm , int a)构造方法弹栈。

5、程序继续执行构造方法(Person(String nm , int a)中的age = a;这时会将23赋值给成员属性age。赋值结束构造方法(Person(String nm , int a)弹栈。

6、当构造方法(Person(String nm , int a)弹栈结束后,Person对象在内存中创建完成,并将0x33赋值给main方法中的p引用变量。

注意:

this代表的是对象,哪个对象调用了this所在的方法,this就代表哪个对象。

调用其他构造方法的语句必须定义在构造方法的第一行,原因是初始化动作要最先执行。

三.this应用实例(判断是否是同龄人)

class Person {

    privateint age;

    private String name;

    // 给姓名和年龄初始化的构造方法Person(String name,int age) {

        // 当需要访问成员变量是,只需要在成员变量前面加上this.即可this.name = name;

        this.age = age;

    }

    publicvoid speak() {

        System.out.println("name=" +this.name + ",age=" +this.age);

    }

    // 判断是否为同龄人publicboolean equalsAge(Person p) {

        // 使用当前调用该equalsAge方法对象的age和传递进来p的age进行比较

        // 由于无法确定具体是哪一个对象调用equalsAge方法,这里就可以使用this来代替/*        * if(this.age == p.age) { return true; } return false;

        */returnthis.age = p.age;

    }

}

你可能感兴趣的:(面向对象(this关键字))