Java成员变量与局部变量同名

看到成员变量和局部变量同名这个知识点的时候一开始有点懵逼,想了一下其实特别简单。

先来看一个简单的代码。

首先我定义了一个Person类。

public class Person {
    private int age=1000;//定义成员变量,年龄为1000

    public void setAge(int age) {
        age=age;
        System.out.println("方法内的年龄"+age);
    }
    public void sayHello() {
        System.out.println("我的年龄是"+age+".");
    }
}

然后在主函数里面创建对象并输出。

Person p=new Person();
p.setAge(20);
p.sayHello();

输出结果是什么?并不是我们想象的我的年龄是20,而是下面这样:

//方法内的年龄20
//我的年龄是1000.

想一下其实就很容易理解。

一句话,如果不同名,那么方法内的变量名代表成员变量;如果同名,那么方法内的变量名就只表示局部变量了,和成员变量一毛钱关系都没有了。

所以,首先当我们创建了一个Person对象p,在创建对象的时候就已经完成了成员变量的初始化了。成员变量age的初始值是1000。

当我们p.setAge(20)的时候,其实这个20只在setAge这个方法内起作用,所以输出了方法内年龄20,执行完这句话后,20就被销毁了。

然后执行sayHello,它里面的age代表的是成员变量的值,所以依旧是1000。

到这里如果还是不能理解,可以自己写代码看输出结果体会下。

那么,当同名的时候,我们就是要让这个变量名表示成员变量,有没有办法呢?

那就要说到this关键字了。我们把Person类改成这样:

public class Person {
    private int age=1000;

    public void setAge(int age) {
        this.age=age;
        System.out.println("方法内的年龄"+age);
    }
    public void sayHello() {
        System.out.println("我的年龄是"+age+".");
    }
}

再运行代码,发现代码运行结果变成了下面这样:

//方法内的年龄20
//我的年龄是20.

this表示的是当前对象。

this.age在这里具体表示p对象的age(即p对象的成员变量age)的值是20。

不能理解的话就多写写代码就能理解了。