`

装载和初始化

阅读更多
Class c = Class.forName(args[0],true,off.getClass();.getClassLoader(););;   
可查看API...............

Class.for(str,true...)
是在装载的时候也进行连接和初始化!!
这时装载的类,其实也进行了初始化!
而Static静态初始化语句是在初始化的时候执行一次!!在接下来的如果还要创建这个类的实例!则不会初始化!!

public interface Assembly
{   
    public void start();;   
}   
  
public class Word implements Assembly
{   
    static
    {   
        System.out.println("Word static initialization!");;   
    }       
  
    public  void start();{   
        System.out.prinlnt("Word starts");;   
    }   
}   
  
public class Office{   
    public static void main(String args[]); throws Exception{   
        Office off = new Office();;   
        System.out.println("类别准备载入");;   
        Class c = Class.forName(args[0],true,off.getClass();.getClassLoader(););;   
        System.out.println("类别准备实例化");;   
        Object o = c.newInstance();;//这时已经初始化........   
        Object o2= c.newInstance();;   
   }   
}  


执行java Office Word,运行结果如下:
“Loaded Office” 
“类别准备载入” 
“Loaded Accembly” 
“Loaded Word”” 
“Word static initialization” 
“类别准备实体化”。 


但是如果将Office.java中Class.forName(args[0],true,off.getClass().getClassLoader())中的true变为false,再执行java Office Word结果显示为:
“Loaded Office” 
“类别准备载入” 
“Loaded Accembly” 
“Loaded Word”” 
“类别准备实体化” 
“Word static initialization”。


Class.forName(false)会装载类!但不会初始化!!这时不会执行程序!!看上面的例子!经过试验 Class.forName默认为是true!
例如DriverManager.forName()如果只是重载,而不初始化的话 那么驱动程序就会不会注册!则也就不能正常使用!
在网上看见这个(感觉大错)
Java初始化顺序
1在new B一个实例时首先要进行类的装载。(类只有在使用New调用创建的时候才会被java类装载器装入)
2,在装载类时,先装载父类A,再装载子类B
3,装载父类A后,完成静态动作(包括静态代码和变量,它们的级别是相同的,安装代码中出现的顺序初始化)
4,装载子类B后,完成静态动作
类装载完成,开始进行实例化
1,在实例化子类B时,先要实例化父类A
2,实例化父类A时,先成员实例化(非静态代码)
3,父类A的构造方法
4,子类B的成员实例化(非静态代码)
5,子类B的构造方法
我感觉有几个 地方不妥!
装载只是接受class文件的字节流,进行解析成为方法区内部的数据结构!装载不一定到使用的时候才开始装载!
在经过验证、准备(类变量的初始化--不是真正的初始化)这时还没有运行程序!
再进行解析,--在常量池里寻找类、字段、引用、接口,把符号引用转换成直接引用
然后进行初始化。如果一个类存在超类的话先初始化超类!如果存在类初始化方法,就运行次方法(static块方法)!--初始化过程
上面还说道类只有在new调用时才会被java磊装载器装入!
如果把上面的理解为初始化的话也不对!
初始化有严格的发生时机!
也就是主动使用!1类实例化2使用类的静态方法3调用某个类的或接口的静态字段或者给该字段赋值时!4初始化子类的时候!(这个时候子类初始化所以他本身被要求初始化)
。。。
类实例化--clone newInstance
据自己测试,newInstance是根据构造函数创建实例的!也就是说相当于new
clone 只是初始化 而不调用new 
实例化不等于new
一旦类初始化完成后就可以,那么就可以随时使用了!访问方法字段,创建实例!都可以!
分享到:
评论

相关推荐

    Java虚拟机装载和初始化一个class类代码解析

    的主要内容是Java虚拟机装载和初始化一个class类的代码解析,包括介绍了装载和初始化的时机与方式,需要的朋友可以参考下。

    8051单片机的UART0串口初始化

    3、初始化程序(以后使用可直接调用此初始化函数)。SYSCLK与BAUDRATE参数修改即可 void UART0_Init (void) { SCON0 = 0x10; // SCON0: 8-bit variable bit rate // level of STOP bit is // 使能RX接收 //...

    azxnet#thinking-in-java#6.9 初始化和类装载1

    装载的时候,所有static对象和static代码块都会按照本来的顺序初始化(亦即它们在类定义代码里写入的顺序)。保证这个顺序是非常关键的,因为衍生类的初始化可

    quanke#think-in-java#6.9 初始化和类装载1

    装载的时候,所有static对象和static代码块都会按照本来的顺序初始化(亦即它们在类定义代码里写入的顺序)。保证这个顺序是非常关键的,因为衍生类的初始化可

    Windows 内核情景分析--采用开源代码ReactOS (上册) part01

    13.2 注册表的初始化和装载 1369 13.3 库函数RtlQueryRegistryValues() 1376 第14章 系统管理进程与服务进程 1394 14.1 系统管理进程Smss 1394 14.2 Windows子系统的服务进程Csrss 1408 14.3 服务管理进程...

    类(型)的生命周期--装载、连接、初始化、卸载

    类(型)的生命周期--装载、连接、初始化、卸载 帮助你正确理解类的产生与消亡

    解析Java类和对象的初始化过程

    类的初始化和对象初始化是JVM管理的类型生命周期中非常重要的两个环节,Google了一遍网络,有关类装载机制的文章倒是不少,然而类初始化和对象初始化的文章并不多,特别是从字节码和JVM层次来分析的文章更是鲜有所见...

    在MAX-IDE中自动初始化数据段

    程序和数据段机制能够在数据存储器自动声明变量位置,并以起始值对这些变量进行初始化。应用程序可以将这些变量值缓存在闪存内,并在需要时恢复这些数据。该方法允许基于汇编语言的应用程序充分利用MAX-IDE提供的...

    Java中对象初始化顺序的详细介绍

    在Java中,类装载器把一个类装入Java虚拟机中,要经过三个步骤来完成:装载、链接和初始化,网上关于Java中对象初始化顺序的文章很多,这篇文章我们将详细介绍Java中对象初始化顺序。有需要的可以参考学习。

    图解Java对象初始化过程以及方法调用

    1:虚拟机加载OOPDemo类(省略详细加载过程(装载、链接、初始化)),提取类型信息(具体保存哪些类型信息查看博文:Java虚拟机体系结构),存储到方法区中,对应图中的绿色矩形区域。  2:通过保存在方法区的字节...

    图文详解Java中class的初始化顺序

    网上有很多关于Java中class的初始化顺序文章,但是本文通过图文更加详细的介绍了Java中class的初始化顺序,并对class的装载顺序进行了讲解,下面一起来看看。

    分支限界法 装载问题

    //初始化装载的总质量为0 Node* Q = new Node[n]; for (int i = 0; i ; ++i) { Q[i].ID = i + 1; Q[i].weight = w[i+1]; W += w[i+1]; } if (W )//如果足够装,全部装入 return W; sort...

    Java类的加载、链接和初始化

    这样Java可以对该对象进行一系列操作,装载过程有两个比较重要的特征:层次组织结构和代理模式。层次组织结构指的是每个类加载器都有一个父类加载器,通过getParent()方法可以获取到。类加载器通过这种父亲-后代的...

    yum本地源装载gcc、gcc-c++、cmake(含配置文件及初始化shell)

    一、解压后上传所有下载文件到liunx服务器 二、修改CentOS-Media.repo中:baseurl=file:///app/iso/为上传文件所在目录 三、执行yum_init.sh后 ... 本资源只有gcc、gcc-c++、cmake三个组件和其依赖组件

    基于threejs实现室内模型的动态装载源码(智慧楼宇).zip

    1,智慧楼宇楼层设施动态装载 2,基于threejs分步加载减少初始化压力。

    JS实现弹出层锁定窗口(改进版).txt

    关于NeatDialog这个窗口在网上应该是随处可见了,不知道是哪位...为了解决这个问题,我参照了Yahoo UI的设计思路,即在页面装载或者初始化时,把NeatDialog也装载或者初始化,但是先不显示,当调用show方法时再显示,

    Linux内核可装载模块对设备驱动的影响

    本文针对2.6内核里模块机制的改变对编写设备驱动程序的影响,从内核模块的编译、装载时的版本检查、初始化与退出、模块使用计数、输出内核符号、命令行输入参数、许可证声明等方面比较了2.4与2.6内核的区别;...

    JAVA笔记.zip

    实例化前初始化 类装载时分配空间 多个对象共享同一内存空间 不能被垃圾收集线程收集 静态代码块 装载时运行 在main 之前 只运行一次 下次类再装载或创建对象时不运行 静态方法 类名调用(推荐) 实际也...

    有关static block静态代码块和单态设计模式

    在Java中,类装载器把一个类装入Java虚拟机中,要经过三个步骤来完成:装载、链接和初始化,其中链接又可以分成校验、准备和解析三步,除了解析外,其它步骤是严格按照顺序完成的,各个步骤的主要工作如下:

    【STM32】HAL库-使用一个定时器使能另一个定时器-主定时器触发模式demo

    先初始化主模式下的定时器,因为在定时器初始化函数中会手动置位UG(为了保证装载ARR,PSC的影子寄存器),而主模式下TRGO信号来源一开始默认是UG位(TIMx_CR2寄存器中的MSM位)。 如果先初始化从模式定时器3,...

Global site tag (gtag.js) - Google Analytics