那个可能将许多人以后自学jvm的这时候单厢碰到,归属于两个小难题,写这首诗的其原因是我在看java有关的复试试题中碰到的,因而随手归纳呵呵:
一、范例
他们先看效用:

他们在typenamemain中初始化非动态表达式或是是方式单厢收起。他们如此一来看一看:

如此一来没一点儿难题,接下去他们嘿嘿其原因:
二、其原因说明
他们须要具体来说晓得的是typename和动态表达式是归属于某两个类,而不归属于类的第一类。他们不间接讲其原因,先从jvm讲起:

这是一张类加载的生命周期图。
1、加载
”加载“是”类加机制”的第两个过程,在加载阶段,虚拟机主要完成三件事:
(2)将那个字节流所代表的的动态存储结构转化为方式区的运行时数据结构
(3)在堆中生成两个代表那个类的Class第一类,作为方式区中这些数据的访问入口。
注意此时会扫描到他们的代码中是否有动态表达式或是是typename等等这些动态数据结构,还未分配内存。
2、验证
验证的主要作用就是确保被加载的类的正确性。
3、准备
准备阶段主要为类表达式分配内存并设置初始值。这些内存都在方式区分配。注意此时就会为他们的类表达式也就是动态表达式分配内存,但是普通成员表达式还没。
4、解析
解析阶段主要是虚拟机将常量池中的符号引用转化为间接引用的过程。
5、初始化
这是类加载机制的最后一步,在那个阶段,java程序代码才开始真正执行。他们晓得,在准备阶段已经为类表达式赋过一次值。在初始化阶端,程序员可以根据自己的需求来赋值了。初始化这时候才会为他们的普通成员表达式赋值。
写到这答案已经出来了,typename是归属于类的,动态方式归属于实例第一类,在类加载的这时候就会分配内存,可以 通过类名间接去访问,非动态成员(变量和方式)归属于类的第一类,所以只有该第一类初始化之后才存在,然后通过类的第一类去访问。
也就是说如果他们在typename中初始化非动态成员表达式会超前,可能将会初始化了两个还未初始化的表达式。因而编译器会收起。