- public class Test {
- int c; // 成员变量 (实例变量)
- static int s1; // 静态变量 (类变量)(全局变量)
- public static void main(String[] args){
- //static int s2; // 局部变量不允许 static 定义
- int b; // 局部变量
- Test t=new Test();
- System.out.println(t.c); // 成员变量系统会提供默认初始值, 随着对象创建而存在 (实例变量)
- b=1;
- System.out.println(b); // 局部变量使用前必须得赋值, 系统不会默认初始化
- // 静态变量随着类的加载而存在, 所有对象共享
- System.out.println(t.s1);
- Test t1=new Test();
- t1.s1=2; // 其中一个对象将其值改变, 即共享数据改变了.
- System.out.println(t1.s1);
- System.out.println(s1);
- System.out.println(Test.s1);
- }
- }
(1) 作用域
成员变量: 有 4 种修饰符决定成员变量的可见性. 如表 1 所示.
局部变量: 它所在的花括号内.
静态变量: 同成员变量.
public: 表明该成员变量或方法对所有类或对象都是可见的, 所有类或对象都可以直接访问.
private: 表明该成员变量或方法是私有的, 只有当前类对其具有访问权限, 除此之外的其它类或对象都没有访问权限.
protected: 表明成员变量或方法对该类自身, 与它在同一个包中的其它类, 在其它包中的该类的子类都可见.
default: 表明该成员变量或方法只有自己和与其位于同一包内的类可见. 若父类与子类位于同一个包内, 则子类对父类的 default 成员变量或方法都有访问权限; 若父类与子类位于不同的 package 内, 则没有访问权限.
这些修饰符只能修饰成员变量, 不能用来修饰局部变量. private 与 protected 不能用来修饰类 (只有 public,abstract,final 能用来修饰类).
(2) 存储位置
成员变量: 存储在堆内存中.
局部变量: 存储在栈内存中.
静态变量: 存储在方法区中.
(3) 初始值
成员变量: 有默认初始值.
局部变量: 没有默认初始值, 使用前必须赋值.
静态变量: 有默认初始值.
(4) 调用方式
成员变量: 对象. 实例变量
静态变量: 类. 静态变量 或者 对象. 静态变量
局部变量: 直接用.
(5) 生命周期
成员变量: 与类的实例化对象作用范围相同, 当类被实例化时, 成员变量就会在内存中分配空间并初始化, 直到这个被实例化对象的生命周期结束, 成员变量的生命周期才结束.
静态变量: 只要类被加载, JVM 就会给类的静态变量分配存储空间.
局部变量: 在方法被调用, 或者语句被执行的时候存在, 当方法调用完, 或者语句结束后, 就自动释放.
(6) 与对象的相关性
静态变量不依赖于特定的实例, 是所有对象共享的数据. 静态变量属于类, 在内存中只有一个复制 (所有实例都指向同一个内存地址), 只要静态变量所在的类被加载, 这个静态变量就会被分配空间, 即可被使用了.
成员变量是每个对象所特有的数据. 成员变量属于对象, 只有对象被创建后, 成员变量才会被分配空间, 才能被使用, 它在内存中存在多个复制.
来源: http://www.bubuko.com/infodetail-2947323.html