1. 分类
分为类变量(静态变量、全局变量)、实例变量、局部变量。其中静态变量、实例变量的区别是是否被static修饰
2. 类变量与实例变量在内存和调用上的区别
(1)调用:类变量是用“类名.变量名”格式来调用,实例变量通过“对象名.变量名”格式来调用
(2)内存:
类变量在类加载的时候就被初始化,而实例变量在对象new 出来后初始化。
类变量单独划分一块内存区域,独立于该类的任何对象。也就是说,不依赖于特定的实例,被类的所有实例共享; 实例变量在对象new出来后再分配内存空间,与具体的对象绑定。——声明一个对象时,不产生static变量的副本,产品实例变量的副本。
3.静态变量的初始化解析
代码一:
public class Test{
private static Test01 t = new Test01();
private static int a = 0;
private static int b;
public static void main(String[] args){
System.out.println(Test.a);
System.out.println(Test.b);
}
classTest01{
public Test01{
Test.a++;
Test.b++;
}
}
}
打印结果:
0
1
分析:
静态变量初始化规则:(1)静态变量会按照声明的顺序先依次声明并设置为该类型的默认值,但不赋值为初始化的值;(2)声明完毕后,再按照声明的顺序依次设置为初始化的值,如果没有初始化就跳过。
所以:main()中的打印Test.a经过了3次变化,Test.a = 0; t初始化: Test01构造方法,a=1, b=1; a初始化:Test.1 = 0, Test.b不变;
3. 静态变量的初始化顺序
(1)顺序:父类的静态代码---->子类的静态代码---->父类的非静态代码--->父类的构造函数--->子类的非静态代码--->子类的构造函数
(2)顺序2:静态变量--->静态代码块--->主函数类(程序入口处)--->根据静态函数的调用情况选择性初始化
4. “类名.对象名.方法名”:例如System.out.println("xxx");
如果静态变量是一个引用,则必须在定义的时候对对象进行初始化
5. 静态变量初始化:(复杂情况)
http://www.cnblogs.com/marmot-1212/p/7299653.html