A:组件就是多维数组去掉一维之后的类型。比如,一维数组“MyParent4[]”的组件就是“MyParent”类型,即“MyParent[]”由多个MyParent类型构成;而二维数组“MyParent[][]”的组件就是“MyParent[]”,即“MyParent[][]”由多个“MyParent[]”数组构成。
目的
为了确保Class文件的字节流中包含的信息符合当前虚拟机的要求,并且不会危害虚拟机自身的安全。
从执行性能的角度上讲,验证阶段的工作量在虚拟机的类加载子系统中又占了相当大的一部分。
流程
验证阶段大致上会完成下面4个阶段的检验动作:
① 文件格式验证;
第一阶段要验证字节流是否符合Class文件格式的规范,并且能被当前版本的虚拟机处理。
目的:保证输入的字节流能正确地解析并存储于方法区之内,格式上符合描述一个Java类型信息的要求。这阶段的验证是基于二进制字节流进行的,只有通过了这个阶段的验证后,字节流才会进入内存的方法区中进行存储,所以后面的3个验证阶段全部是基于方法区的存储结构进行的,不会再直接操作字节流。
② 元数据验证;
③ 字节码验证;
④ 符号引用验证
对于虚拟机的类加载机制来说,验证阶段是一个非常重要的、但不是一定必要(因为对程序运行期没有影响)的阶段。如果所运行的全部代码(包括自己编写的及第三方包中的代码)都已经被反复使用和验证过,那么在实施阶段就可以考虑使用-Xverify:none参数来关闭大部分的类验证措施,以缩短虚拟机类加载的时间。
目的
为类的静态变量分配内存,并将其初始化为默认值。

但也存在着一些特殊情况:
如果类字段的字段属性表中存在ConstantValue属性,那在准备阶段变量value就会被初始化为ConstantValue属性所指定的值,假设类变量value的定义变为:
public static final int value = 123;
编译时Javac将会为value生成ConstantValue属性,在准备阶段虚拟机就会根据ConstantValue的设置将value赋值为123。c 类 static 函数
示例
public class MyTest6 {
public static void main(String[] args) {
Singleton singleton = Singleton.getInstance();
System.out.println("counter1: " + Singleton.counter1);
System.out.println("counter2: " + Singleton.counter2);
}
}
class Singleton {
public static int counter1;
public static int counter2 = 0;
private static Singleton singleton = new Singleton();
private Singleton() {
counter1++;
counter2++;
}
public static Singleton getInstance() {
return singleton;
}
}
结果:
counter1: 1
counter2: 1
修改:
本文来自电脑杂谈,转载请注明本文网址:
http://www.pc-fly.com/a/jisuanjixue/article-80669-6.html
就一艘破军舰
其实我作为大陆人十分理解台胞和香港人的关切