More on Class Loading and Initialization

  上一篇博客中对于类的加载和初始化进行了详细的说明,但上一篇博客代码中的main()所在的类为导出类,

对其中一些问题的理解可能会引起误导和不明确,所以补充这篇博客进一步说明。以下面的代码为例进行说明:


//File: P130_Practice5.py
//Author: lxw
//Time: 2014-05-31
//Usage: P130 Practice 5.

class A{
static B b = new B();
public A(){
System.out.println("A constructor.");
}
}

class B{
public B(){
System.out.println("B constructor.");
}
}

class C{
public C(){
System.out.println("C constructor.");
}
public void show(){}
}

class E{
static int i = print("WARNING.");
public E(){
System.out.println("E constructor.");
}
static int print(String s){
System.out.println(s);
return 1;
}
}

class D extends A{
B b = new B();
static C c = new C();
}

public class P130_Practice5 {
public static void main (String [] args){
D d = new D(); // 顺序是: 先是加载完需要的类(只加载需要的类),然后才执行初始化。
//D.c.show(); // 只加载
E e = new E(); // 顺序是: 先是加载完需要的类(只加载需要的类),然后才执行初始化。
}
}

Output:


[email protected]23:53:04:~/eclipse/java/javaComLine$ java P130_Practice5
B constructor.
C constructor.
A constructor.
B constructor.
WARNING.
E constructor.

  需要注意的是:  

  B constructor.  -- 加载类A
  C constructor.  -- 加载类D
  A
constructor.  -- A()
  B constructor.  -- 初始化类D
  WARNING.    
 -- 加载类E
  E constructor.  -- E() 

  所以我们可以看出对于每一条语句的执行,类的加载和初始化的顺序是:先加载完所有需要的类(只加载“需要”的类,

不需要的不加载),然后才执行初始化。

时间: 2024-12-16 08:40:22

More on Class Loading and Initialization的相关文章

Application Initialization Module for IIS 7.5

http://www.iis.net/downloads/microsoft/application-initialization Overview IIS Application Initialization for IIS 7.5 enables website administrators to improve the responsiveness of their Web sites by loading the Web applications before the first req

类在什么时候加载和初始化

理解类在JVM中什么时候被加载和初始化是Java编程语言中的基础概念,正因为有了Java语言规范,我们才可以清晰的记录和解释这个问题,但是很多Java程序员仍然不知道什么时候类被加载,什么时候类被初始化,类加载和初始化好像让人很困惑,对初学者难以理解,在这篇教程中我们将看看类加载什么时候发生,类和接口是如何被初始化的,我并不会拘泥于类加载器的细节或者说类加载器的工作方式.仅仅使这篇文章更加专注和简结. 类什么时候加载 类的加载是通过类加载器(Classloader)完成的,它既可以是饿汉式[ea

这些 iOS 面试基础题目,你都深入了解吗?

唐巧前辈说这些都是 iOS 的基础问题,应该对此深入的了解.当初看到时,大部分回答不上来,因为平时没有好好思考整理过.这里大部分的概念大多会在学习 OC 的过程中遇到过,但还是得经过写代码才能有更深的理解.反正我当初看那些设计模式是云里雾里,每个字都认识,就是不知道说的什么.即使现在,有些东西,我也不是很理解. Objective-C 底层 Objective-C runtime library:Objective-C 的对象模型,Block 的底层实现结构,消息发送,消息转发,category

The JSR-133 Cookbook for Compiler Writers

The JSR-133 Cookbook for Compiler Writers by Doug Lea, with help from members of the JMM mailing list. [email protected]. Preface: Over the 10+ years since this was initially written, many processor and language memory model specifications and issues

你真的了解load方法么?(转载)

本文授权转载,作者:左书祺(关注仓库,及时获得更新:iOS-Source-Code-Analyze) 因为 ObjC 的 runtime 只能在 Mac OS 下才能编译,所以文章中的代码都是在 Mac OS,也就是 x86_64 架构下运行的,对于在 arm64 中运行的代码会特别说明. 写在前面 文章的标题与其说是问各位读者,不如说是问笔者自己:我真的了解 + load 方法么? + load 作为 Objective-C 中的一个方法,与其它方法有很大的不同.它只是一个在整个文件被加载到运

java classLoader机制解析

类从被加载到虚拟机内存中开始,到卸装出内存为止,它的整个生命周期包括了:加载,连接(验证,准备,解析),初始化,使用和卸载七个阶段.其中验证.准备和解析三个部分称为连接,也就是说,一个Java类从字节代码到能够在JVM中被使用,需要经过加载.链接和初始化这三个步骤 .我们看一看Java虚拟机的体系结构. Java虚拟机的体系结构如下图所示: Java类加载的全过程,是加载.验证.准备.解析和初始化这五个阶段的过程.而加载阶段是类加载过程的一个阶段.在加载阶段,虚拟机需要完成以下三件事情: 通过一

java.lang.ExceptionInInitializerError

一.错误,原因 二.原因 引起java.lang.ExceptionInInitializerError 错误的原因是:在类的初始化时,出错.也就是说,在加载类时,执行static的属性.方法块时,出错了. 比如 <span style="font-family:Times New Roman;">public class AA{ private static AA aa = new AA(); private AA(){//构造方法 init(); } public vo

Android Error: java.lang.NoClassDefFoundError

转载:http://www.tuicool.com/articles/IVBVn2 原文  http://deepinmind.iteye.com/blog/2078286 当在静态初始化块中出现了异常的时候,JVM会抛出 java.lang.ExceptionInInitializerError异常.如果你了解Java中的静态变量,你会知道它们是在类加载的时候进行 初始化的.如果在这个静态变量初始化的过程中出现了异常,那么就会抛出 java.lang.ExceptionInInitialize

有关java类、对象初始化的话题,从一道面试题切入

最近在整理东西时,刚好碰到以前看的一道有关java类.对象初始化相关题目,觉得答案并不是非常好(记忆点比较差,不是很连贯).加上刚好复习完类加载全过程的五个阶段(加载-验证-准备-解析-初始化),所以如果周志明大大诚不我欺的话,无论是类加载过程.还是实例化过程的顺序我都已经了然于心了才对. 一道面试题 标题:2015携程JAVA工程师笔试题(基础却又没多少人做对的面向对象面试题) 地址:https://zhuanlan.zhihu.com/p/25746159 该题代码如下: public cl