变量:类变量,实例变量

时间:2023-02-02 05:40:17

 

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