this关键字

本文深入探讨Java中构造函数的使用,解析命名遮挡现象及其解决方案,介绍this关键字的多种用途,包括调用本类属性、普通方法及构造方法,帮助理解对象初始化过程。

我们先来看以下代码

class Person{
    public String name;
    public int age;
    public Person(String name,int age){
        name = name;
        age = age;
    }
}
public class Practice {
    public static void main(String[] args) {
        Person person = new Person("张三",18);
        System.out.println(person.name);
        System.out.println(person.age);
    }
}
//执行结果
null
0

我们期望的结果是张三,18,为什么会出现 null 和 0 呢?我们对象的初始化是在构造函数中,不妨在看看构造函数,我们可以看到,成员属性有 name 和 age ,而构造函数的形参和我们的成员属性命名相同,即发生了命名遮挡(name shading),这时候,我们把实参传入之后,相当于 name = 张三,age = 18,但是我们并不知道此时的 name 和 age 是属性还是形参,编译器按照就近原则,把 name 和 age 看成形参,相当于自己给自己赋值,此时 name 和 age 是形参,局部变量,所以出了构造函数,局部变量释放,并没有改变属性的值,而不直接初始化是会给默认值的,所以结果是 null 和 0

那么,是不是我们就不能使用和成员属性相同的名字了?答案是 No ,名字我们是没有规定的,所以相同了也不是没有办法,只要我们区分开这两个就可以了,那么,在 java 中,我们就可以使用 this 关键字

this 关键字的作用

this.本类属性

通过 this 访问本类属性

比如上述代码,我们稍加修改,就可以得到我们预期结果

class Person{
    public String name;
    public int age;
    public Person(String name,int age){
        // this 调用本类属性
        this.name = name;
        this.age = age;
    }
}
public class Practice {
    public static void main(String[] args) {
        Person person = new Person("张三",18);
        System.out.println(person.name);
        System.out.println(person.age);
    }
}
//执行结果
张三
18

this.普通方法

通过 this 调用本类普通方法

class Person{
    public String name;
    public int age;
    public Person(String name,int age){
        // this 调用本类属性
        this.name = name;
        this.age = age;
    }
    public void print(){
    	System.out.println("我可以跑");
    }
    public void show(){
    	// this 调用本类普通方法
    	this.print();
    	System.out.println("吃饭");
    }
}
public class Practice {
    public static void main(String[] args) {
        Person person = new Person("张三",18);
        System.out.println(person.name);
        System.out.println(person.age);
        person.show();
    }
}
//执行结果
张三
18
我可以跑
吃饭

this(构造方法)

通过 this 调用构造方法,包括有参构造和无参构造

  • this调用构造方法,根据参数数量自动匹配各重载方法
  • 在普通方法中,不能用调用构造方法,构造方法想调用其它构造方法只能用this()调用
  • 在构造方法中this调用本类其他构造方法必须写在首行
class Person{
    public String name;
    public int age;

    public Person(){
        System.out.println("我是无参构造");
    }
    public Person(String name){
        this();
        System.out.println("我是一个参数的有参构造");
    }
    public Person(String name,int age){
        this(name);
        System.out.println("我是两个参数的有参构造");
    }
    public void print(){
        System.out.println("我可以跑");
    }
    public void show(){
        // this 调用本类普通方法
        this.print();
        System.out.println("吃饭");
    }
}
public class Practice2 {
    public static void main(String[] args) {
        Person person = new Person("张三",18);
        person.show();
    }
}
//执行结果
我是无参构造
我是一个参数的有参构造
我是两个参数的有参构造
我可以跑
吃饭

this代表当前对象的引用

class Person{
    String name;
    public String show(){
        return this.name;
    }
    public void print(){
        System.out.println(this);
    }

    @Override
    public String toString() {
        return "Person{" +
                "name='" + name + '\'' +
                '}';
    }
}
public class Practice3 {
    public static void main(String[] args) {
        Person person = new Person();
        System.out.println(person.show());
        person.print();
    }
}
//执行结果
null
Person{name='null'}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值