staic与final中的变量问题?

  1. static与final关键字问题
package com.aaa;
import java.util.ArrayList;
import java.util.List;
class Apple {
    private static long a;
    private static long b = a++;
    public long geta(){ return b;}
}
class Orange {}
public class Test0128 {
    public static void main(String[] args) {
        List apples = new ArrayList();
        for(int i=0;i<3;i++){
            apples.add(new Apple());
        }
        for(int i=0;i<apples.size();i++){
            Apple apple = (Apple) apples.get(i);
            System.out.println(apple.geta());
        }
    }

}
  1. 输出结果为: 0,0,0
  2. 问题: 当把private static long b = a++;中static 改为final时,输出结果变为0,1,2

static在代码编译的时候初始化变量,final可以在代码运行中初始化变量。

a++是先赋值给b,再自生加1
1.static作用域针对所有对象,类属性,加载类的时候,只初始化了一次,用一个空间,一个对象里面变了他的值,另外一个访问的也是他
2.final针对当前对象,每new一个,就会初始化这个对象b一个独立的空间
所以第一次都为static的时候,类加载的时候只初始化了一次,就是按顺序,a=0;b=a++=0; a=1;a没有给初始值,初始值为0
你b改成final后每new一次,就会初始化一个对象,每个对象里面独立的b
第一次new,a=0;b=a++=0;a=1;
第二次new, a=1;b=a++=1;a=2;
第二次new, a=2;b=a++=2;a=3;