`

装载和初始化

阅读更多
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 类代码解析 Java 虚拟机装载和初始化一个 Class 类是 Java 应用程序开发中的一个关键步骤。只有被 Java 虚拟机装载的 Class 类型才能在程序中使用。下面,我们来详细解析 Java ...

    Java类文件动态装载

    装载是将类的二进制数据读入内存并创建Class对象,初始化则是执行类的静态初始化块。 2. **自定义类加载器** 开发者可以自定义类加载器,通过继承java.lang.ClassLoader类并重写`findClass()`或`loadClass()`方法...

    XS128各个模块初始化程

    总结起来,飞思卡尔XS128的初始化程序涉及到系统时钟、PWM、I/O口和定时器的设置,这些都是微控制器应用的基础。通过正确配置这些模块,我们可以确保设备按预期运行,实现各种控制和传感任务。理解并掌握这些初始化...

    8051单片机的UART0串口初始化

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

    servlet实现案例.rar

    装载和初始化只在Servlet首次被请求时发生,服务阶段则是在每次请求时,而销毁发生在Servlet容器关闭或者Servlet不再需要时。 **实现一个简单的Servlet** 1. 创建Servlet类:首先,你需要创建一个继承自`javax....

    数据块下载不初始化.docx

    - 若要重新初始化所有变量,需要将变量从预留保持存储区移至常规存储区域,通过“下载无需初始化”取消预留存储区,然后进行“软件(复位存储区)”的编译和下载。 - 使用“在线 > 装载 PLC 程序到设备并且复位”...

    ARM处理器系统初始化过程.docx

    ### ARM处理器系统初始化过程详解 #### 一、概述 ARM处理器因其低功耗特性与高性能,在嵌入式系统中有着广泛的应用。初始化是系统启动的关键步骤之一,它为后续的操作系统加载及应用程序运行提供必要的环境准备。...

    C8051fXXX中UART0,UART1详细初始化(已经调试了).txt

    根据提供的文件信息,本文将详细解释C8051fXXX系列微控制器中UART0与UART1的初始化过程。此文档特别关注了已调试完成的UART0与UART1的配置方法,这对于理解如何在该系列微控制器上实现串行通信至关重要。 ### 一、...

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

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

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

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

    STM32是怎么初始化看门狗和喂狗的

    下面详细介绍如何初始化和喂狗操作。 ### 独立看门狗(IWDG)初始化和喂狗 独立看门狗由低速内部时钟(LSI)提供时钟源,即使在系统时钟失败的情况下也能工作。以下是独立看门狗初始化和喂狗操作的详细步骤: 1. ...

    Linux内核源码分析之系统初始化

    本文将详细介绍Linux系统内核的初始化过程,包括系统引导和内核初始化两个关键阶段。 #### 1. 系统引导 当个人电脑(PC)开机时,基于80x86架构的中央处理器(CPU)最初工作在实模式下,只能访问低端640KB的内存空间。...

    嵌入式系统初始化分析与UCOS-II移植

    - **初始化存储器系统**:配置内存控制器和内存芯片,准备内存区域供后续使用。 - **初始化C所需的存储器空间**:为C语言编写的程序预留内存空间。 - **调用C入口函数**:执行C语言程序的入口函数,开始应用程序的...

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

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

    深入java虚拟机加载初始化

    在本例中,由于`Singleton`类中`singleton`变量的初始化发生在类初始化阶段之前,这意味着在`Singleton`对象被创建时,静态变量`a`和`b`尚未被初始化。因此,`a++`和`b++`实际上是在默认值的基础上进行的,即`a`的...

    Lab07-1_CPU初始化程序完善1

    在本实验中,学生需要补充完 PMON 源代码中被删除的 Cache 初始化、TLB 初始化、串口初始化部分,编译后在一个已完成的 SoC 设计上正常启动并成功装载和启动 Linux 内核。要求刚下载完 bit 文件后,PMON 运行时打印...

    STM32外设初始化C语言代码(SPI、UART、TIME、CLOCK)

    以下将详细介绍标题和描述中提到的四个外设:SPI、UART、TIME(定时器)和CLOCK(时钟)的初始化C语言代码实现。 1. **SPI(Serial Peripheral Interface)**: SPI是一种同步串行通信协议,常用于连接微控制器与...

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

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

Global site tag (gtag.js) - Google Analytics