JAVA类的加载过程

周末闲来无事,做个小例子去看一下JAVA代码初始化的过程

JAVA代码初始化分为两个步骤:类初始化,对象初始化。

类初始化

1 类初始化是指类加载器将类加载到内存时,对类成员的初始化过程(其中包括static修饰的变量)。

2 对于加载完的类,它的类变量都会赋一个默认值,即使你定义时就赋值了。

3 例如int类型就是0,引用类型就是null。

对象初始化

1 其实和类初始化差不多,但是他通过构造函数对对象进行了赋值

其实简单来说

类初始化做了2件事情:1 把所有属性全部赋值为0或者NULL,2 然后给静态变量进行赋值

对象初始化做了1件事情:1 执行构造函数给普通变量赋值或者静态变量赋值(每次NEW 对象时是不执行静态代码块的)

**需要注意的是执行顺序,构造函数会先执行,静态代码块后执行。

例子1 初始化

public class JvmTest {
    private  JvmTest JvmTest ;//private JvmTest jvmTest=null
    private  int count1;      //private int count1=0;
    private  static int count2;//private int static=0;
    public static void main(String[] args) {
        System.out.println("count1=" + new JvmTest().count1);
        System.out.println("count2=" + new JvmTest().count2);
        System.out.println("JvmTest=" + new JvmTest().JvmTest);
    }
}

执行结果

count1=0
count2=0
JvmTest=null

------------------------------------------------------------------------------------------------------------------------------------

例子2 初始化+赋值的过程

如下这样的代码

public class JvmTest {
    private static JvmTest JvmTest= new JvmTest();
    private int count1=5;
    private static int count2=5;

}

可以理解为

public class JvmTest {
    private static JvmTest JvmTest;
    private int count1;
    private static int count2;
    static{
        System.out.println("static init---------------");
        count2=5;
        JvmTest=new JvmTest();
    }
    JvmTest(){
        System.out.println("constrctor init---------------");
        count1=5;
    }
    public static void main(String[] args) {
        System.out.println("count1=" + JvmTest.count1);
        System.out.println("count2=" + JvmTest.count2);
        System.out.println("JvmTest=" + JvmTest.JvmTest);
    }
}

执行结果

static init---------------
constrctor init---------------
count1=5
count2=5
JvmTest[email protected]

初始化的过程会将定义的属性先赋值为0或者NULL,然后再在构造函数和静态代码区中进行正式的赋值

例3 初始化 static和constructor的初始化顺序为,先执行构造函数块,再执行static。

public class JvmTest {
    private static JvmTest JvmTest = new JvmTest();
    private int count1 =5;
    private static int count2= 5;
    static{
        System.out.println("static init");
        count2++;
        System.out.println(count2);
    }
    JvmTest(){
        System.out.println("constructor init");
        count1++;
        count2++;
        System.out.println(count1);
        System.out.println(count2);
    }
    public static void main(String[] args) {
        System.out.println("类初始化完成");
    }
}

执行结果(第一步是类初始化属性为0或者为NULL),第二步对象初始化在构造函数和静态代码区中进行赋值

constructor init//执行了 count=5;count1++;count2++
6
1
static init//执行了count2=5;count2++
6
类初始化完成

最后一道思考题

package test.test;

import org.junit.Test;

public class JvmTest {
    private static JvmTest JvmTest = new JvmTest();
    private int count1 = 5;
    private static int count2 = 5;
    static {
        System.out.println("static init");
        count2++;
    }

    JvmTest() {
        System.out.println("constructor init");
        count1++;
        count2++;
    }

    public static void main(String[] args) {
        System.out.println("count1=" + new JvmTest().count1);
        System.out.println("count2=" + new JvmTest().count2);
        System.out.println("JvmTest=" + new JvmTest().JvmTest);
    }
}
constructor init
static init
constructor init
count1=6
constructor init
count2=8
constructor init
JvmTest[email protected]

大致步骤为

第一步类初始化后静态count2的值为6。其他的无视

第二步 new JvmTest时会允许构造函数,每次都会执行count1=5;count1++;count2++; 而不会执行static了。

答案

count2是静态变量,打印输出count2是在第二次NEW的时候输出的,所以是初始化的6和2次++的过程,答案为8

count是类的属性,所以每次都是count=5,count++,答案为6

最后的总结

1 JAVA代码初始化的过程是给属性初始化0或者NULL

2 执行构造函数为普通属性赋值

3 执行静态代码区,为静态变量赋值

 综上所述,初始化一个JAVA类代码会包含执行3个过程---》属性初始化+通过执行构造函数为普通变量赋值+通过执行静态代码区为静态变量赋值

如果我们NEW一个对象的过程呢?

1 初始化普通属性(非static变量)

2 执行构造函数为普通或者静态属性赋值

从这里看出,NEW的过程不会在允许static的代码块了,只会允许构造函数。

JAVA类的加载过程

时间: 2024-10-07 00:10:37

JAVA类的加载过程的相关文章

java 类的加载过程

ClassLoader的主要职责就是负责各种class文件到jvm中,ClassLoader是一个抽象的class,给定一个class文件的二进制名,ClassLoader会尝试加载并且在jvm中生成构建这个类的各个数据结构,然后使其分布在对应的内存区域中. 1类的加载过程简介 类的记载过程一般分为三个比较大的阶段,分别是加载阶段,连接阶段和初始化阶段,如下图所示 加载阶段:主要负责查找并且加载类的二进制数据文件,其实就是class文件. 连接阶段:连接阶段所做的工作比较多,细分的话还可以分为如

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

一.Java的类加载机制回顾与总结: 我们知道一个Java类要想运行,必须由jvm将其装载到内存中才能运行,装载的目的就是把Java字节代码转换成JVM中的java.lang.Class类的对象.这样Java就可以对该对象进行一系列操作,装载过程有两个比较重要的特征:层次组织结构和代理模式.层次组织结构指的是每个类加载器都有一个父类加载器,通过getParent()方法可以获取到.类加载器通过这种父亲-后代的方式组织在一起,形成树状层次结构.代理模式则指的是一个类加载器既可以自己完成Java类的

java 反射,类的加载过程以及Classloader类加载器

首先自定义一个类Person package reflection; public class Person { private String name; public int age; public String getName() { return name; } public void setName(String name) { this.name = name; } public int getAge() { return age; } public void setAge(int a

jvm系列(一):java类的加载机制

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

【Java基础】Java类的加载和对象创建流程的详细分析

相信我们在面试Java的时候总会有一些公司要做笔试题目的,而Java类的加载和对象创建流程的知识点也是常见的题目之一.接下来通过实例详细的分析一下. 实例问题 实例代码 Parent类 1 package mytest.javaBase; 2 3 public class Parent { 4 int a = 10; 5 static int b = 11; 6 // 静态代码块 7 static { 8 System.out.println("Parent静态代码块:b=" + b)

Java类的加载 链接 初始化

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

跟王老师学反射(二):Java类的加载、连接和初始化

跟王老师学反射(二):Java类的加载.连接和初始化 主讲教师:王少华   QQ群号:483773664 学习内容: 了解类的加载.连接和初始化 一.类的生命周期 当我们编写一个java的源文件后,经过编译会生成一个后缀名为class的文件,这种文件叫做字节码文件,只有这种字节码文件才能够在java虚拟机中运行,java类的生命周期就是指一个class文件从加载到卸载的全过程.一个java类的完整的生命周期会经历加载.连接.初始化.使用.和卸载五个阶段,当然也有在加载或者连接之后没有被初始化就直

JVM中java类的加载时机(转载:http://blog.csdn.net/chenleixing/article/details/47099725)

Java虚拟机把描述类的数据从Class文件加载到内存,并对数据进行校验.转换解析和初始化,最终形成可以被虚拟机直接使用的Java类型,这就是虚拟机的加载机制.类从被加载到虚拟机内存中开始,到卸载出内存为止,它的整个生命周期包括了:加载(Loading).验证(Verification).准备(Preparation).解析(Resolution).初始化(Initialization).使用(using).和卸载(Unloading)七个阶段.其中验证.准备和解析三个部分统称为连接(Linki

java 类的加载及反射机制

一,类的加载,连接,初始化 一个类被加载到JVM需要三个步骤:加载,链接,初始化 1,先说下加载过程 2,连接 注意连接过程分为三个阶段,验证,准备,解析 3,初始化 这里注意:类的加载过程,先加载静态代码块,其次是代码块,然后是构造函数 静态成员之间级别一样,因此谁在前,谁最先被加载 二,反射机制 1,先理解下反射 2,为什么要使用反射 可能以上叙述依然很抽象,下面我们用具题代码说明 在开始代码之前我们要先,明白一个对象 java.lang.Class 我们可以这样想,java程序在运行前,会