阅读 36

成员变量与局部变量

一. 首先了解JVM的内存模型

image.png

image.png

二. 局部变量和成员变量的区别

1. 定义

  • 成员变量:
  1. 实例变量
  2. 类变量:静态变量
  • 局部变量:
  1. 一般在方法体{},形参,代码块{}中

2. 修饰符

  • 成员变量:很多。。。
  • 局部变量:final

3. 存储的位置

  • 局部变量:栈
  • 实例变量:堆
  • 类变量:方法区

4. 作用域

  • 局部变量:从声明开始,到所属的}的结束

  • 实例变量:在当前类中“this.xx”(有时this可以省略),在其他对象中“对象名.xx”访问

    例如:当如i为26行this修饰的时候,这个i就是第20行的实例变量i,当i为25行的时候,根据就近原则,i为第24行的i

    image.png

  • 类变量:在当前类中“类名.xx”(有时候类名.可以省略),在其他类中“类名.xx”或者“对象名.xx”访问

5. 生命周期

  • 局部变量:每个线程,每一次调用执行都是新的生命周期,局部变量在方法体内,每一次方法的执行,都会在虚拟机占中开辟一片内存新建一个栈帧,随着方法的执行完毕,栈帧也随着消失(局部变量保存在栈中),更何况小小的局部变量呢
  • 实例变量:随着对象的创建而初始化,随着对象的的回收而消亡,每个一个对象的实例变量都是独立的。
  • 类变量:随着类的初始化而初始化,随着类的卸载而消亡,该类的所有变量的类变量是共享的

三. 例子

/**
 * 成员变量:
 *    (1)实例变量
 *    (2)类变量:静态变量
 *    修饰符:。。。。。。。。。
 * 局部变量:
 *    一般在方法体{},形参,代码块{}中
 *    修饰符:final
 *
 * 存储的位置:
 *    局部变量:栈
 *    实例变量:堆
 *    类变量:方法区
 */
public class Exam {

    static int s;//类变量
    int i;//实例变量
    int j;//实例变量

    {
        int i=1;//非静态代码块中的局部变量
        i++;
        j++;
        s++;
    }
    public void test(int j){//形参,局部变量
        j++;
        i++;
        s++;
    }

    public static void main(String[] args) {
        Exam object1 = new Exam();
        Exam object2 = new Exam();
        object1.test(10);
        object1.test(20);
        object2.test(30);
        System.out.println(object1.i+","+object1.j+","+object1.s);
        System.out.println(object2.i+","+object2.j+","+object2.s);
    }

复制代码

输出结果:

2,1,5
1,1,5

image.png

文章分类
后端
文章标签