可以说,类的代码在初次使用时才加载。这通常指加载发生于创建类的第一个对象之时,但当访问

static域或static方法时,也会发生加载(通过下面的这段代码验证)。

class LoadTest {// The static clause is executed upon class loading:static {System.out.println("Loading LoadTest");}static void staticMember() {}static int i = 0;
}
public class classLoading {public static void main(String args[]) {System.out.println("Calling static member");//new LoadTest();    // 1//LoadTest.staticMember();    // 2LoadTest.i++;    // 3System.out.println("Creating an object");}
}

  Output:

lxw@22:39:26:~/eclipse/java/javaComLine$ java classLoading
Calling static member
Loading LoadTest
Creating an object

  无论保留语句1,语句2还是语句3,代码运行结果都是上面的结果。

  所有的static对象和static代码段会在加载时按照程序中的顺序(定义类时的书写顺序)而依次初始化。

  本文将以下面的代码为例展开论述:

class Insect {private int i = 9;protected int j;Insect() {System.out.println("i = " + i + ", j = " + j);j = 39;}private static int x1 =printInit("static Insect.x1 initialized");static int printInit(String s) {System.out.println(s);return 47;}
}public class Beetle extends Insect {private int k = printInit("Beetle.k initialized");public Beetle() {System.out.println("k = " + k);System.out.println("j = " + j);}private static int x2 =printInit("static Beetle.x2 initialized");public static void main(String[] args) {System.out.println("Beetle constructor");//Beetle b = new Beetle();    // 1 //Beetle b;    //2
  }
}

Output:

lxw@11:03:16:~/eclipse/java/javaComLine$ java Beetle
static Insect.x1 initialized
static Beetle.x2 initialized
Beetle constructor

Analyze:

  Part 1.

  上面的代码执行时,首先将试图访问main(),于是开始启动并找出Beetle类的编译代码,在加载的过程中

编译器注意到它有一个基类,于是先对基类进行加载。此时基类中的static初始化开始被执行,然后执行导出

类中的static初始化。”先执行基类然后再执行导出类“的原因是导出类的static初始化可能会依赖于基类成员是

否被初始化。

  简略的说就是:基类的static数据成员初始化 -> 导出类的static数据成员初始化 -> main()

  至此,不管代码中是否创建一个基类或导出类的对象都执行这些步骤。

  Part 2.

  更改上面的代码,将语句2的注释去掉,则运行结果与上面的结果相同。

  Part3.

  更改上面的代码,将语句1的注释去掉:

  Output:  

lxw@22:55:00:~/eclipse/java/javaComLine$ java Beetle
static Insect.x1 initialized
static Beetle.x2 initialized
Beetle constructor
i = 9, j = 0
Beetle.k initialized
k = 47
j = 39

  请注意各个输出的顺序。当用new创建导出类的一个对象时,其执行顺序如下:

  1. 基类初始化:先是基类的非静态成员初始化,然后是基类构造器的执行

  2. 导出类初始化:先是导出类的非静态成员初始化,然后是导出类构造器的执行

转载于:https://www.cnblogs.com/lxw0109/p/Initialization_and_class_loading.html

Initialization and Class loading - Java相关推荐

  1. Initialization in《The Java® Virtual Machine Specification Java SE 7 Edition》

    类(如果无特殊说明,本文中的"类"表示类和接口,下同)的初始化主要包括初始化的同步及执行其初始化方法<clinit>. 在以下几种情况下会触发类的初始化: (1)执行J ...

  2. java解压加密的7z格式文件

    引言 最近在 项目中需要解压带有密码的.7z文件,然后获得里面的数据,之前都是zip 文件没有接触过解压7z类型的 文件,在这分享一下解压工具类,该 工具类可以同时解压带有密码的7z文件和zip文件. ...

  3. A comparison of C# vs. java

    转发上:http://www.25hoursaday.com/CsharpVsJava.html#friends A COMPARISON OF MICROSOFT'S C# PROGRAMMING ...

  4. java bufferedwrite_Java BufferedWriter BufferedReader 源码分析

    一:BufferedWriter 1.类功能简介: BufferedWriter.缓存字符输出流.他的功能是为传入的底层字符输出流提供缓存功能.同样当使用底层字符输出流向目的地中写入字符或者字符数组时 ...

  5. Java中的单例模式

    2019独角兽企业重金招聘Python工程师标准>>> 最近网上查找资料做了一下总结,Java中的单例模式主要是有以下两种实现方式: 1.public class Singleton ...

  6. 【Java设计模式】单例模式

    ### 1. 概述 > 单例模式是确保某一个类中有且只有一个实例. ---------- ### 2. 饿汉式单例 ``` java public class SingletonInstance ...

  7. [Java] SSH框架笔记_Struts2配置问题

    1.Unable to load bean: type: class:com.opensymphony.xwork2.ObjectFactory - bean - jar:file:/D:/Progr ...

  8. 探究 Java 应用的启动速度优化

    简介:在高性能的背后,Java 的启动性能差也令人印象深刻,大家印象中的 Java 笨重缓慢的印象也大多来源于此.高性能和快启动速度似乎有一些相悖,本文将和大家一起探究两者是否可以兼得. 作者 | 梁 ...

  9. Java快速提升_java快速复习 一 基础语法

    最近看很多算法书,比较不错的有不少都是java语言描述,所以用一天时间快速研究并整理java  ,参考资料:java入门经典 Call this file "Example2.java&qu ...

  10. java todo error_运行我的第一个Java应用程序出错

    我已经开始学习 java并在尝试运行我的第一个程序时遇到问题,如下所示: public class HelloWorld { public static void main(String[] args ...

最新文章

  1. 【CSS3教程】CSS3基础常用技巧实例集合
  2. hadoop配置文件聚集功能(设置日志可以查看)
  3. Zookeeper分布式一致性原理(六):Zookeeper开源客户端zkClient
  4. NLP面试时,项目经历要怎么讲?
  5. JAVA中如何确保N个线程可以访问N个资源,但同时又不导致死锁?
  6. ITK:多路输出不同的类型
  7. python程序员脱单攻略_520 情人节 :属于 Python 程序员的脱单攻略大合集(视频版)...
  8. 使用Java 8 CompletableFuture和Rx-Java Observable
  9. Spark的枚举类型实例!scala的枚举。
  10. HDU 5136 Yue Fei's Battle
  11. 第1章 别让医生欺负你
  12. java 解析二进制_Java二进制指令代码解析
  13. reinterpret_cast 最小demo
  14. 小D课堂 - 新版本微服务springcloud+Docker教程_6-03 高级篇幅之zuul常用问题分析
  15. 图书管理系统源代码<Java>(带文字讲解)(javase)
  16. C语言关键字之inline
  17. PHP 将文字转化mp3文件
  18. Hypervisor定义、种类及产品介绍
  19. 【学习笔记】网关 路由
  20. Seurat | 强烈建议收藏的单细胞分析标准流程(基础质控与过滤)(一)

热门文章

  1. img引用网络图片资源无法加载问题解决
  2. 阶段1 语言基础+高级_1-3-Java语言高级_06-File类与IO流_09 序列化流_1_序列化和反序列化的概述...
  3. 在webconfig中写好连接后,在程序中如何调用?
  4. 自己了解的一些信安的工具清单
  5. 减小服务器负担,Apache启用mod_expires模块
  6. SQL Server 数据库性能优化(转载)
  7. java获取文件后缀名(正则表达式)+文件名
  8. maven环境、本地仓储配置(下载安装)idea配置maven
  9. 关于java中Exception异常
  10. 001-keras简介