Java笔记

直接初始化数组

[]中不需要指出数组大小,否则会报错

new int[]{1,1};

代码执行顺序

父类静态代码块->父类静态成员变量初始化->子类静态代码块->子类静态成员变量初始化->(父类代码块->父类成员变量初始化)(这两个谁先声明谁在前面)->子类代码块->子类成员变量初始化->父类构造函数->子类构造函数->…

  • 静态先于非静态执行
  • 代码块可以当做成员变量来看,对于静态代码块,类加载的时候执行;对于非静态代码块,构造函数之前执行,可以想成是在成员变量初始化的时候执行
  • 父类优先于子类执行(因为子类涉及到对父类的重写等操作,只有父类初始完毕了,子类重写和引用才有意义)

加载类原理

###准备阶段:

将类的静态变量进行分配内存空间、初始化默认值。(对象还没生成呢,所以这个时候没有实例变量什么事情)

新分配的空间中,所有的原始类型将被置0(int类型为0,boolean类型为false等等),引用类型将被置成null;所以singleton 也是一个属性,也被默认值为null

这阶段会为类变量(指那些静态变量)分配内存并设置类比那辆初始值的阶段,这些内存在方法区中进行分配。这里要说明一下,这一步只会给那些静态变量设置一个初始的值,而那些实例变量是在实例化对象时进行分配的。这里的给类变量设初始值跟类变量的赋值有点不同,比如下面:

public static int value=123;

在这一阶段,value的值将会是0,而不是123,因为这个时候还没开始执行任何java代码,123还是不可见的,而我们所看到的把123赋值给value的putstatic指令是程序被编译后存在于(),所以,给value赋值为123是在初始化的时候才会执行的。

这里也有个例外:

public static final int value=123;

这里在准备阶段value的值就会初始化为123了。这个是说,在编译期,javac(还是JVM?答案:http://blog.csdn.net/cutesource/article/details/5904542)会为这个特殊的value生成一个ConstantValue属性,并在准备阶段jm就会根据这个ConstantValue的值来为value赋值了。即编译的时候,就将该值或者是对象放入常量池。

注:java程序要运行需要两次编译,一次是javac,而次是jvm。第一次也是过程中就包含常量池。

初始化阶段:(被动引用)

  • 子类调用父类的静态变量,子类不会被初始化。只有父类被初始化。。对于静态字段,只有直接定义这个字段的类才会被初始化.
  • 通过数组定义来引用类,不会触发类的初始化
  • 访问类的常量,不会初始化类
Share