请教几个问题 看这句话:
静态初始化只在Class对象首次进行加载的时候进行一次
问:
1,首次加载是什么意思 难道同一个类还要加载很多次吗
2,加载的是Class对象吗
3,初始化是在类加载的时候进行的吗
4,每加载类一次进行一次初始化吗
5,初始化是在创建对象或者调用静态方法是进行的吗
谢谢
静态初始化只在Class对象首次进行加载的时候进行一次
问:
1,首次加载是什么意思 难道同一个类还要加载很多次吗
2,加载的是Class对象吗
3,初始化是在类加载的时候进行的吗
4,每加载类一次进行一次初始化吗
5,初始化是在创建对象或者调用静态方法是进行的吗
谢谢
所以说 首次加载 吧,我也不确定。
可以这样试验,在jsp中定义一个 static 的变量,读出来看看,然后改一下,(导致重新加载),然后再看看。首次引用到class对象时加载,如果引用的是实例,那么必然先加载new这个实例,此时class对象就被加载了。初始化动作是在加载的时候执行的,加载也分几个步骤的。其中包括初始化。static 部分只初始化一次,non-static 部分是new的时候做的。初始化 在创建对象或者调用静态方法之前进行的,你能用的时候jvm保证这个已经可以用了,肯定是完成了初始化的。
java 的类加载机制分三步,加载 ---连接 ---初始化
加载: 将.class文件中的二进制数据读入到内存中,把它存放在运行时数据区的反方法区内,然后在堆区创建一个java.lang.Class对象,用来封装类在方法区内的数据结构。
jvm加载类二进制数据有这几种途径:
a: 把一个java源文件动态编译成class文件。
b: 从一个本地文件系统中加载class文件。
c: 通过网络下载类的.class文件。比如:applat.
d: 从Zip,jar或其它类型的归档文件中提取.class文件。
e: 从一个专有的数据库中提取.class文件。
连接:包括三个过程: 验证,准备,和解析。其中验证主要是检查与语法上的错误。准备将静态变量赋上其类型默认值。
解析:将符号引用转变为直接引用。
初始化:将静态变量赋上初始值,执行静态代码快,其顺序是从上到下的顺序执行。
类加载器在加载不了类的时候,并不一定报错,而是类在第一次主动使用的时候,才会去报加载错误信息。
类首次主动使用,大概有这些情况:
1:调用了类的静态方法或变量。
2:用反射的方式创建对象。
写了个例子,你看下就明白了:
public class TestClass {
/*
* static block
*/
static{
System.out.println("static block!");
}
/*
* non static block
*/
{
System.out.println("non static block!");
}
TestClass(){
System.out.println("common constructor!");
}
public static void main(String[] args){
TestClass class1 = new TestClass(); //first load
TestClass class2 = new TestClass(); //second load
}
}
2、是class对象
3、是
4、是
5、静态初始化是家载类时进行,