区别 | 局部变量 | 成员变量 |
声明位置 | 方法体{}中、形参、代码块{}中 | 成员变量:类中方法外 分为两类:1类变量:有static修饰 2:实例变量:没有static修饰 |
修饰符 | final | public、protect、private、final、static、volatile、transient(序列化) |
存储位置 | 栈 | 实例变量:堆 类变量:方法区 |
作用域 | 从声明处开始,到所属的 } 结束 | 实例变量:在当前类中this.(有时可以省略),在其他类中用对象名. 类变量:在当前类中类名.(有时可以省略),在其他类中"类名."或"对象名."访问 |
生命周期 | 每一个线程,每一次调用执行行都是新的生命周期 | 实例变量:随着对象的创建而初始化,随着对象的被回收而消亡,每一个对象的实例化变量是独立的; 类变量:随着类的初始化而初始化,随着类的卸载而消亡,该类的所有对象的类变量是共享的。 |
关于堆、栈、方法区:
堆:1.所有的对象实例以及数组都要在堆上分配;
2.JVM只有一个堆区被所有线程共享,堆中不存放基本类型和对象引用,只存放对象本身
栈:1.每个线程包含一个栈区,栈中只保存基础数据类型的对象和自定义对象的引用(不是对象),对象都存放在堆区中
2.每个栈中的数据(原始类型和对象私有)都是私有的,其他栈不能访问
方法区:1.又叫静态区,跟堆一样,被所有线程共享。方法区包含所有的class和static变量
2.方法区包含的都是在整个程序中永远唯一的元素,如class,static变量
3.运行时常量池都分配在Java虚拟机中的运行之中。