此文章,为学习记录
变量在编译期和运行期的区别
public class FinalVariableDemo {
public static void main(String[] args) {
System.out.println(StaticTest.str);
}
}
class StaticTest{
static final String str = UUID.randomUUID().toString();
static {
System.out.println("I am StaticTest's static method");
}
}
当一个常量的值在代码编译器不能确定,那么这个 值就不会放到调用方法所在类的常量池中,反而会导致在运行时,使所在类初始化。
数组创建和类加载
public class FinalVariableDemo {
public static void main(String[] args) {
StaticTest[] staticTest = new StaticTest[4];
//打印出staticTest实例的类型
System.out.println(staticTest.getClass());
}
}
class StaticTest{
static final String str = UUID.randomUUID().toString();
static {
System.out.println("I am StaticTest's static method");
}
}
上面只打印出实例的类型,并没有初始化静态代码块,说明我们创建一个类数组并不能导致其初始化。而且通过打印出来的类型可以看出,我们创建类数组,jvm在运行期间为我们创建如上类型的数组实例,具体类型是我们的类。
对于数组来说,JavaDoc经常将构成数组的元素称为Component,实际上就是降低一个维度后的类型。比如堆二维数组来说,二维数组的一维组就是一个Component
助记符
在创建一个原始类型数组,发编译以后,查看他们的反编译结果是什么:
int[] arrs = new int[4];
反编译后,发现有两种助记符表示:
anewarray : 表示创建一个引用类型的(如,类、接口)的数组,并将其引用值压入栈顶。
newarray: 表示的是原始数据类型的数组。
反编译以后 第15行,经过测试,它标识了数组的大小。表示方式和上次的助记符一样