JVM 1.类的加载、连接、初始化

Java类的加载是由类加载器来完成的,过程如下:

首先,加载是把硬盘、网络、数据库等的class文件中的二进制数据加载到内存的过程,然后会在Java虚拟机的运行时数据区的堆区创建一个Class对象,用来描述该类,再在方法区存放这些二进制数据,用来保存类对应的数据结构

Java的类加载器有哪些?

下面的String对象是由bootstrap根类加载器加载的,而自定义类C是由系统加载器加载的:

/**
 * 源文档中这样描述:
 *     Some implementations may use null to represent the bootstrap class loader.
 *         This method will return null in such implementations
 *         if this class was loaded by the bootstrap class loader.
 * @author Administrator
 *
 */
public class ClassLoader2 {

    //测试
    public static void main(String[] args) throws ClassNotFoundException {
        Class c1 = Class.forName("java.lang.String");
        System.out.println("String类的加载器:"+c1.getClassLoader());//bootstrap根类加载器(C++实现的),返回null
        Class c2 = Class.forName("com.mlxs.classloader.MyClass");
        System.out.println("自定义MyClass类的加载器:"+c2.getClassLoader());//AppClassLoader 系统(应用)加载器
        /**
         * 返回数据:
         *     String类的加载器:null
         *    自定义MyClass类的加载器:[email protected]
         */
    }

}

class MyClass{

}

关于初始化,什么情况下初始化类?在主动使用的时候初始化:

一个例子:

public class ClassLoader1 {

    private static ClassLoader1 classLoader1 = new ClassLoader1();
    private ClassLoader1(){
        a ++;
        b ++;
    }
    public static int a;
    public static int b = 0;
    public static ClassLoader1 getIntsance(){
        return classLoader1;
    }

    //测试
    public static void main(String[] args) {
        ClassLoader1 clazz = ClassLoader1.getIntsance();
        /**
         * 类加载后,
         *     准备阶段:(1)classLoader1赋值null,(2)a和b都赋值默认值0;
         *  初始化阶段: (1)new classLoader1的时候,a++(=1),b++(=1)
         *            (2)a没默认值,值不变;b默认值为0,b赋值0
         * 所以,最后a=1,b=0
         *
         * 如果把new ClassLoader1()放到int a b 的后面,则最后a=1,b=1
         */
        System.out.println("a:"+clazz.a);
        System.out.println("b:"+clazz.b);
    }

}

结果:

a:1
b:0

  

要注意的是:

子类主动使用,会导致父类的初始化;而父类主动使用,不会使子类初始化。如,new Object() 不会导致它的子类(所有的Java类)都初始化

而子类实现接口,当子类被初始化,不会导致接口初始化。只有当接口中的静态变量被使用时才会初始化

时间: 2024-11-21 03:19:54

JVM 1.类的加载、连接、初始化的相关文章

<<黑马程序员>>类的加载和初始化

类的加载和初始化 + (void)load  方法   ①  当程序一启动就会把所有类和分类而且加载后就会调用每个类的+load方法只会调用一次.   ②  先加载父类在加载子类,每个类加载完就会调用load方法 2 . + (void)initialize    方法      ①  当第一次使用这个类时就会调用  + (void)initialize    方法 调用顺序:①  先加载父类在加载子类               ② 先调用父类的load方法在调用子类的load方法      

黑马程序员----类的加载和初始化

类的加载和初始化 当程序一启动,就会加载项目中所有的类和分类,而且加载后会调用每一个类和分类中的+load方法(即使不创建对象也会调用),且只会调用一次: 当第一次使用某个类时,就会调用当前类的+initialize方法: 先加载父类,再加载子类(先调用父类的+load方法,再调用子类的+load方法): 先初始化父类,再初始子类(先调用父类的+initialize方法,再调用子类的+initialize方法): 注意点:1.调用创建子类时即会调用父类的+initialize方法,也会调用子类的

黑马程序员___OC类的加载和初始化

构造方法 完整的创建一个可用的对象需要两步 1.分配储存空间   +alloc 2.初始化   -init Person *p1 = [Person alloc] Person *p2 = [p1 init] 相当于:Person *p = [Person new] ,但是这个方法虽然可以快速创建一个新的对象,但是不能对新对象进行有选择的初始化 有时候我们想创建的对象都有一个初始值,这个时候就可以重写构造方法 - (id)init { //一定要调用回super的init方法,初始化父类中声明的

java类的加载以及初始化顺序 .

类的加载和初始化的了解对于我们对编程的理解有很大帮助,最近在看类的记载方面的问题.从网上查阅了若干文章,现总结如下: 我们通过一段代码来了解类加载和初始化的顺序: package com.classloader.demo; class Insect {  private int i = 9;  protected int j;  Insect() {    System.out.println("i = " + i + ", j = " + j);    j = 3

【转】JVM类的加载与初始化

版权声明: 本文原创作者:书呆子Rico 作者博客地址:http://blog.csdn.net/justloveyou_/ 摘要: 我们知道,一个.java文件在编译后会形成相应的一个或多个Class文件,这些Class文件中描述了类的各种信息,并且它们最终都需要被加载到虚拟机中才能被运行和使用.事实上,虚拟机把描述类的数据从Class文件加载到内存,并对数据进行校验,转换解析和初始化,最终形成可以被虚拟机直接使用的Java类型的过程就是虚拟机的类加载机制.本文概述了JVM加载类的时机和生命周

类的加载.连接与初始化

加载:查找并加载类的二进制数据 连接: -验证:确保被加载的类的正确性, -准备:为类的静态变量分配内存,并将其初始化为默认值 -解析:把类中的符号引用转换为直接引用 初始化:为类的静态变量赋予正确的初始值 ============================================================================ 类的加载指的是将类的.class文件中的二进制数据读入到内存中,将其放在运行时数据区的方法区内,然后在堆区创建一个java.lang.Cl

JVM:java类的加载机制

原文连接:https://www.cnblogs.com/ityouknow/p/5603287.html 类加载机制的奥妙. 1.什么是类的加载 类的加载指的是将类的.class文件中的二进制数据读入到内存中,将其放在运行时数据区的方法区内,然后在堆区创建一个java.lang.Class对象,用来封装类在方法区内的数据结构.类的加载的最终产品是位于堆区中的Class对象,Class对象封装了类在方法区内的数据结构,并且向Java程序员提供了访问方法区内的数据结构的接口. 类加载器并不需要等到

java类的加载与初始化总结

1.触发类加载的原因(主动调用与被动调用): 六种主动调用: 1).创建类的实例(new操作.反射.cloning.反序列化) 2).调用类的静态方法 3).使用或对类/接口的static属性赋值(不包括static final的与在编译期确定的常量表达式(包括常量.字符串常量)) 4).调用API中的反射方法,Class.forName()等. 5).子类被初始化 6).被设定为JVM启动时的启动类(含main方法的主类) 其它都为被动引用:被动引用不会触发类的初始化操作(只会加载.链接),如

Java类的加载 链接 初始化

原文地址 Java类的加载.链接和初始化.Java字节代码的表现形式是字节数组(byte[]),而Java类在JVM中的表现形式是java.lang.Class类的对象.一个Java类从字节代码到能够在JVM中被使用,需要经过加载.链接和初始化这三个步骤.这三个步骤中,对开发人员直接可见的是Java类的加载,通过使用Java类加载器(class loader)可以在运行时刻动态的加载一个Java类:而链接和初始化则是在使用Java类之前会发生的动作.本文会详细介绍Java类的加载.链接和初始化的