您的位置:首页 > 编程语言 > Java开发

了解Java的类装载器(static什么时候初始化)

2017-08-09 17:58 148 查看

我们本篇先了解类装载器的基础,重点说的是:static什么时候初始化**

下一篇我们就可以深入Java的类装载器,我们先看看有几种方法载入类。




一.想必大家都知道用new这个关键字:

B.java文件:

class B
{
static{
System.out.println("--B--");
}
public void start()
{
System.out.println("--start--");

}
}


a.java文件:

public class a
{
public static void main(String [] args)
{
System.out.println("--a--");
B b=new B();
B c=new B();
}

}


我们执行的结果:



强调内容

1.先 javac a.java

2.在 java -verbose a

3.出现了上图,接下来的执行结果也是按这步骤来的

如上图得知:

1.B类new了2个对象,但是只载入一次

2.static区也只初始化一次


2.大家应该也从JDBC中得知用class.forName();

forNama()函数有一个参数的。还有3个参数的,重点就在这里:




1.一个参数的:

a.java文件:

public class a
{
public static void main(String [] args) throws Exception
{
System.out.println("--a--");
class.forName("B");

}

}


使用class.forNmae要throws 异常

结果:



分析:

1.结果跟上面一样


2.使用forName(“B”,true,a.class.getClassLoader());也跟上面一样

3.使用forName(“B”,false,a.class.getClassLoader());

a.java代码:

public class a
{
public static void main(String [] args) throws Exception
{
System.out.println("--a--");
Class.forName("B",false,a.class.getClass.Loader());

}
}


结果:



分析:

1.a类,B类载入了,但是st
4000
atic没有初始化???

我们把a.java代码换一下:

public class a
{
public static void main(String [] args) throws Exception
{
System.out.println("--a--");
Class c=    Class.forName("B",false,a.class.getClassLoader());

B d=(B) c.newInstance();//时例化一个对象

}

}


结果:



分析:

1.static的结果出来了,难道static的初始化是第一次实例化的时候吗??
我们接下来看第3种载入方法,看看是不是这个结果


三.Classloader的loadClass()

a,java的代码:

public class a
{
public static void main(String [] args) throws Exception
{
System.out.println("--a--");
a.class.getClassLoader().loadClass("B");

}

}


结果:



分析:

1.a,B类都载入了,但是static没有初始化,我们现在创建一个对象看看


a.java的代码:

public class a
{
public static void main(String [] args) throws Exception
{
System.out.println("--a--");
Class b= a.class.getClassLoader().loadClass("B");

B c=(B) b.newInstance();

}

}


结果:



分析:

1.static初始化了


总结:

内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息