Initialization and Class loading - Java
可以说,类的代码在初次使用时才加载。这通常指加载发生于创建类的第一个对象之时,但当访问
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(); //
LoadTest.i++; //
System.out.println("Creating an object");
}
}
Output:
lxw@:::~/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; //
}
}
Output:
lxw@:::~/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@:::~/eclipse/java/javaComLine$ java Beetle
static Insect.x1 initialized
static Beetle.x2 initialized
Beetle constructor
i = , j =
Beetle.k initialized
k =
j =
请注意各个输出的顺序。当用new创建导出类的一个对象时,其执行顺序如下:
1. 基类初始化:先是基类的非静态成员初始化,然后是基类构造器的执行
2. 导出类初始化:先是导出类的非静态成员初始化,然后是导出类构造器的执行
Initialization and Class loading - Java的更多相关文章
- Error loading: \Java\jdk1.6.0_35\jre\bin\server\jvm.dll
先看看错误:complie: [exec] Error loading: D:\Program Files\Java\jdk1.6.0_35\jre\bin\server\jvm.dll [exec] ...
- Thinking in Java——笔记(7)
Reusing Classes The first is composition,You're simply reusing the functionality of the code, not it ...
- Thinking in Java,Fourth Edition(Java 编程思想,第四版)学习笔记(八)之Reusing Classes
The trick is to use the classes without soiling the existing code. 1. composition--simply create obj ...
- Java 6 JVM参数选项大全(中文版)
原文来自: http://kenwublog.com/docs/java6-jvm-options-chinese-edition.htm 本文是基于最新的SUN官方文档Java SE 6 Hotsp ...
- 【Java设计模式】单例模式
### 1. 概述> 单例模式是确保某一个类中有且只有一个实例. ----------### 2. 饿汉式单例``` javapublic class SingletonInstance { p ...
- Java theory and practice
This content is part of the series: Java theory and practice A brief history of garbage collection A ...
- [Java] SSH框架笔记_Struts2配置问题
1.Unable to load bean: type: class:com.opensymphony.xwork2.ObjectFactory - bean - jar:file:/D:/Progr ...
- 深入理解JVM—Java 6 JVM参数配置说明
原文地址:http://yhjhappy234.blog.163.com/blog/static/316328322011119111014657/ 使用说明< xmlnamespace pre ...
- Java learning notes (1):Basic Knowlege points
Basic Knowlege points: 1: it's necessary that there is only one public class in per .java file 2: .j ...
随机推荐
- ZBar之自定义二维码扫描
// // YvanQRCodeViewController.m // zBar // // Created by City--Online on 15/6/8. // Copyright (c) 2 ...
- 关于EF查询的性能
现象:前台grid发送ajax请求,通过谷歌devtool发现“waiting”时间高达23s(1500条数据);可见服务器端代码处理花费时间很长: 解决:分析代码,有两处代码注释掉后速度提升明显 / ...
- 802.11 wireless 二
802.11 wireless 2wireless spectrum(无线频谱)1.无线网络使用RF(射频)信号2.无线电也是电磁波3.频谱基于波长被划分,归为多个类型4.无线网络被归为微波段(mic ...
- SVN--(Eclipse)在历史记录中比较版本差异
前言 在SVN中比较各版本的差异是非常重要的功能. 方式 看图说话 结果
- 【BZOJ】【3991】【SDOI2015】寻宝游戏
dfs序 我哭啊……这题在考试的时候(我不是山东的,CH大法吼)没想出来……只写了50分的暴力QAQ 而且苦逼的写的比正解还长……我骗点分容易吗QAQ 骗分做法: 1.$n,m\leq 1000$: ...
- 【BZOJ】【1067】 【SCOI2007】降雨量
思路题 玛雅,这分类讨论快讨论地疯了…… 从huzecong神的题解那里得到的灵感…… 首先考虑最好确定的情况:为true的时候,此时必须同时满足 1.x和y这两年的降雨量已知,且rain[x]< ...
- 【BZOJ】【1874】取石子游戏
SG函数 嗯博弈论入门题,关于SG函数这个东西可以去看VFK神犇的博客,讲的非常清楚Orz. 传送门:vfleaking.blog.163.com/blog/static/17480763420123 ...
- tomcat 一个服务 多端口网站
多站点多端口 <Service name="Catalina"> <Connector port="8080" protocol ...
- .Net 执行 Oracle SQL语句时, 中文变问号
带中文的Sql语句在.Net调用时, 中文变问号(可使用 SQL Tracker工具跟踪) 问题: 服务器的字符集与客户端的字符集不一致. 解决方法: 1. 查看服务端的字符集: ...
- 2013年优秀jQuery插件
今天为大家推荐的是2013年的第一期,在这期里面十个jQuery插件涵盖了响应式的网格布局插件.图片放大插件.表单元素中自定义select插件,google 地图插件.文件拖放上传插件.tooltip ...