java类的加载以及初始化顺序
类的加载和初始化的了解对于我们对编程的理解有很大帮助,最近在看类的记载方面的问题。从网上查阅了若干文章,现总结如下:
我们通过一段代码来了解类加载和初始化的顺序:
package com.classloader.demo;
class Insect {
private int i = 9;
protected int j;
Insect() {
System.out.println("i = " + i + ", j = " + j);
j = 39;
}
private int p=print(" Insect.p initialized");
private static int x1 =print("static Insect.x1 initialized");
static int print(String s) {
System.out.println(s);
return 47;
}
}
public class Beetle extends Insect {
private int k = print("Beetle.k initialized");
public Beetle() {
System.out.println("k = " + k);
System.out.println("j = " + j);
}
private static void dd()
{
System.out.println("dd ");
}
private static int x2 =
print("static Beetle.x2 initialized");
public static void main(String[] args) {
System.out.println("Beetle constructor");
Beetle b = new Beetle();
}
}
本程序的运行结果如下:
static Insect.x1 initialized
static Beetle.x2 initialized
Beetle constructor
Insect.p initialized
i = 9, j = 0
Beetle.k initialized
k = 47
j = 39
首先当我们运行此程序的时候,主线程启动,编译器开始查找Beetle.class这个类,找到这个类后,开始加载这个类,在加载的过程发现有extends关键字,所以编译器开始去加载insect.class这个类,(如果在加载这个类的时候如果发现这个类还有基类,那么insect的直接基类就会被加载,如果还有基类,以此类推)此时因为insect没有基类了,所以不需要再加载,此时(加载insect类时)insect类的静态代码将执行(静态成员的初始化),所以此时打印出了 static Insect.x1 initialized,
当insect的静态代码执行完后, Beetle的静态代码开始执行 (初始化x2), 所以打印出:static Beetle.x2 initialized;
到现在为止,所有基类以及静态的初始化动作都已经执行完了,可以创建对象了。
这时候执行System.out.println("Beetle constructor");所以打印出:Beetle constructor;
下面开始执行Beetle b = new Beetle();此时首先为Beetle分配内存空间,并且都初始化为0,注意boolean类型变量初始化为false;
在Beetle内的代码执行前,首先会调用基类的构造器,在基类(insect)的构造器内的代码执行前,首先要执行基类的非静态成员的初始化,此时p被初始化为47,并且打印出:Insect.p initialized;当执行初始化后,基类的构造器里的代码System.out.println("i = " + i + ", j = " + j)开始执行,所以打印出:i = 9, j = 0;此时j被初始化为39;
当基类的构造器的代码执行完后,首先要对Beetle类的非静态成员进行显示的初始化,此时K被初始化为47,并且打印出:Beetle.k initialized;等初始化完成后,Beetle构造器里的代码开始执行,所以打印出:K=47;J=39,o(∩_∩)o...哈哈程序的结构分析完了。
值得注意的是:静态成员初始化是从最顶层的类开始的,因为子类成员的初始化可能回用到基类的成员。
所以类加载以及初始化的顺序是:类的静态成员初始化分配内存(有父类的先父类,然后自己)->然后main方法执行->类初始化{类非静态成员的初始化,然后执行构造器(有父类的先给父类的非静态成员初始化,然后父类的构造器)}
特记于此!以备勿忘!
参考文献:http://xmuzyq.iteye.com/blog/83864
java类的加载以及初始化顺序的更多相关文章
- Java类的加载 链接 初始化
原文地址 Java类的加载.链接和初始化.Java字节代码的表现形式是字节数组(byte[]),而Java类在JVM中的表现形式是java.lang.Class类的对象.一个Java类从字节代码到能够 ...
- Java 类的加载与初始化
本文结构: 1.先看几道题 2.类的加载于初始化 (1)类的加载 (2)类的初始化 (a)会发生类的初始化的情况 (b)不会发生类的初始化的情况 首先看几道题. 解析可在看完讲解后再看 Demo1 p ...
- Java类的加载及初始化
每个类的编译代码都存在于它自己的独立文件中,该文件在需要使用该程序代码时才会被加载.通常有以下三种加载情况: (1) 访问了子类的静态变量或静态方法:仅对类的静态变量,静态块执行初始化操作,并仅初始化 ...
- java类的加载和执行顺序
以前面试总会碰到涉及到类的执行过程的笔试题.下面记录我自己的测试结果: public class ClassA { public static ClassA classa = new ClassA() ...
- java类的加载与初始化
https://blog.csdn.net/u013349237/article/details/71076617 1在命令行启动虚拟机jvm进行加载, 2用class.forname()方法进行动态 ...
- 【转】 java类的加载和执行顺序
1.先执行Test类的静态代码块后执行Test类的main方法,说明要执行类的方法需要先加载这个类. 2.在创建ClassB的对象时,先去加载了父类ClassA.说明加载子类时如果没有加载父类,会先加 ...
- Java类的加载、链接和初始化
一.Java的类加载机制回顾与总结: 我们知道一个Java类要想运行,必须由jvm将其装载到内存中才能运行,装载的目的就是把Java字节代码转换成JVM中的java.lang.Class类的对象.这样 ...
- java 类的加载,链接,初始化
本篇的话题,讨论Java类的加载.链接和初始化.Java字节代码的表现形式是字节数组(byte[]),而Java类在JVM中的表现形式是java.lang.Class类的对象.一个Java类从字节代码 ...
- JAVA类的加载、连接与初始化
JAVA类的加载.连接与初始化 类的声明周期总共分为5个步骤1.加载2.连接3.初始化4.使用5.卸载 当java程序需要某个类的时候,java虚拟机会确保这个类已经被加载.连接和初始化,而连接这个类 ...
随机推荐
- c++中new分配动态数组
变长一维数组 这里说的变长数组是指在编译时不能确定数组长度,程序在运行时需要动态分配内存空间的数组.实现变长数组最简单的是变长一维数组,你可以这样做: //文件名: array01.cpp ...
- php正则表达式判断是否为ip格式
<?php $a = '127.0.0.111'; $b = preg_match("/^\d{1,3}\.\d{1,3}\.\d{1,3}\.\d{1,3}$/",$a); ...
- matlab实现的嵌套乘法、高精度、二分法
嵌套乘法的计算: \[ P(x) = 1 - x + x^2 - x^3 + ...+ x ^ {98} - x^{99} \] function y = nest( d, c, x, b ) if ...
- left edge algorithm.
今天在看GCPC 2013 的时候,遇到了一个简单的任务分配的题目. 即给定一系列任务[l,r], 每个人不能同时做两个, 最多需要几个人来完成? 这个问题的一个标准解法是对所有l,r排序,然后遇到l ...
- VB数据库经典实例总结(一)
先让大家看一张图.随后讲解..... 敲完五个例子之后的心情是非常好的.并没有想象中的那么难,深究它的话大致思路就是.: 建立数据库 --->利用VB导出数据 --->供人们使用.. 因为 ...
- Aspose 导出excel小demo
//转为pdf private void CelltoPDF(string cellPath, string pdfPath) { Workbo ...
- 10.31Daily Scrum
人员 任务分配完成情况 明天任务分配 王皓南 主网页的框架搭建,任务编号752 研究代码,学习相应语言,讨论设计思路 申开亮 学习数据库的操作,任务编号753 研究代码,学习相应语言,讨论设计思路 王 ...
- Notes of the scrum meeting(11/1)
meeting time:9:00~10:30p.m.,November 1st,2013 meeting place:20号公寓楼前 attendees: 顾育豪 ...
- Ubuntu系统下USB转串口的使用
PC系统是Ubuntu12.04,与路由器开发板之间用USB转串口线连接. 一.硬件连接 确认Ubuntu对USB转串口设备的支持. 1.# lsmod | grep usbserial如果有usbs ...
- Caffe安装教程(原创)
转载请注明地址 说明:本文档参考自Caffe官网的安装说明,http://caffe.berkeleyvision.org/installation.html 如果对安装过程中,需要用到的依赖不明,请 ...