浅析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。
不能理解的话就多写写代码就能理解了。

  • 成员变量和局部变量的区别

成员变量:
①成员变量定义在类中,在整个类中都可以被访问。
②成员变量随着对象的建立而建立,随着对象的消失而消失,存在于对象所在的堆内存中。
③成员变量有默认初始化值。

局部变量:

①局部变量只定义在局部范围内,如:函数内,语句内等,只在所属的区域有效。
②局部变量存在于栈内存中,作用的范围结束,变量空间会自动释放。
③局部变量没有默认初始化值

在使用变量时需要遵循的原则为:就近原则
首先在局部范围找,有就使用;接着在成员位置找。

    原文作者:万里天
    原文地址: https://blog.csdn.net/hhf365/article/details/89552828
    本文转自网络文章,转载此文章仅为分享知识,如有侵权,请联系博主进行删除。
点赞