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

本文探讨了Java中类的加载方式及static块的初始化时机。通过三种不同的类加载方法对比,包括使用new关键字、class.forName()方法以及ClassLoader的loadClass()方法,详细分析了这些操作如何影响static块的执行。
摘要由CSDN通过智能技术生成

我们本篇先了解类装载器的基础,重点说的是: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类载入了,但是static没有初始化???

我们把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初始化了

总结:

这里写图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值