标签:const 字节 str 子类 支持 block span new t jvm
类的生命周期包括7个阶段:加载 、验证、准备、解析、初始化、使用和卸载
通过子类引用父类的静态变量时,不会导致子类的初始化过程
代码如下:
public class SSClass
{
static
{
System.out.println("SSClass");
}
}
public class SuperClass extends SSClass
{
static
{
System.out.println("SuperClass init!");
}
public static int value = 123;
public SuperClass()
{
System.out.println("init SuperClass");
}
}
public class SubClass extends SuperClass
{
static
{
System.out.println("SubClass init");
}
static int a;
public SubClass()
{
System.out.println("init SubClass");
}
}
public class NotInitialization
{
public static void main(String[] args)
{
System.out.println(SubClass.value);
}
}
输出的结果:
SSClass
SuperClass init!
123
通过数组来引用类,不会触发该类初始化 例如:SubClass[] array = new SubClass[10] 原因在于,这时候的字节码指令是newarray
当类变量被final关键字修饰的时候,引用ConstanValue不会触发该类初始化
原因:这种常量在类的准备阶段已经存放在常量池里了,调用和该类没有太大关系
应用测试题
package com.zzjmay;
public class TestJVM {
public static void main(String[] args)
{
staticFunction();
}
static TestJVM st = new TestJVM();
static
{
System.out.println("1");
}
{
System.out.println("2");
}
TestJVM()
{
System.out.println("3");
System.out.println("a="+a+",b="+b);
}
public static void staticFunction(){
System.out.println("4");
}
int a=110;
static int b =112;
}
输出的结果是
2
3
a=110 ,b=0
1
4
注意:
对象初始化的步骤是先初始化成员变量,再初始化构造器
类初始化 按照代码顺序执行,如果存在嵌套对象初始化,先执行对象初始化
欢迎加入学习交流群569772982,大家一起学习交流。
标签:const 字节 str 子类 支持 block span new t jvm
原文地址:http://www.cnblogs.com/wl2014/p/7902671.html