【Java】 关于类的初始化

在Java中,所有文件都是一个类,类的初始化无处不在。那么,Java在类初始化时到底做了什么呢?在此记录一个小练习,通过输出,我们可以比较清晰地看出Java在类的初始化时,工作顺序是怎样的。

 1 public class Insect {
 2
 3     private int i = 9;
 4     protected int j ;
 5     public Insect() {
 6         // TODO Auto-generated constructor stub
 7         print("i =" + i + ", j = " + j );
 8         j = 39;
 9     }
10
11     private static String x1 = print("static Insect.x1 initialized");
12
13     private static String print(String str){
14         System.out.println(str);
15         return "47";
16     }
17
18 }
19
20 public class Beetle extends Insect{
21     private String k = print("Beetle.k initialize");
22     private static String t = print("static Beetle.k initialize");
23     public Beetle() {
24         print("k =" + k);
25         print("j =" + j);
26     }
27
28     public static void main(String[] args) {
29         print("Beetle.k initialize start");
30         Beetle beetle = new Beetle();
31     }
32
33     private static String print(String str){
34         System.out.println(str);
35         return "48";
36     }
37
38 }

运行上面的程序,会输出以下结果:

static Insect.x1 initialized
static Beetle.k initialize
Beetle.k initialize start
i =9, j = 0
Beetle.k initialize
k =48
j =39

下面,我们对输出结果进行一下分析。

首先,上面有两个类,一个Insect,一个Beetle,其中Insect是Beetle的父类。其中入口是Beetle父中的main方法。

程序首先会想要执行main方法,但是它在加载Beetle方法时,会发现Beetle是有父类的。所以它会转到父类,先加载父类。

所以程序的第一步是执行第11行,private static String x1 = print("static Insect.x1 initialized"); 初始化 static成员;

加载完父类Insect之后,程序会开始加载子类Beetle,因此第二步会执行第22行,private static String t = print("static Beetle.k initialize");初始化 子类的static成员;

完成之后,程序终于进入了main方法,于是执行了第29行,print("Beetle.k initialize start");直接输出;

接着要获取Beetle实例,即会调用Beetle的构造方法。但是Beetle是有父类的,所以程序会先调用父类的构造方法第7、8行 , 输出i和j的值;

在构造了父类之后,程序再构造子类,但是在执行构造方法前,会先完成成员的构造,所以会先执行第21行,private String k = print("Beetle.k initialize");初始化String k;

最后,程序才会执行Beetle的构造方法,执行第24、25行,创建一个Beetle对象,对输出k和j的值。

Done

时间: 2024-11-13 11:50:36

【Java】 关于类的初始化的相关文章

my java note -------类的初始化和加载

java 的初始化和类加载 1. java 对象初始化时,会先加载对应的类,随后加载其基类(如果存在基类); 2. 先从基类执行static 初始化,在执行子类static 初始化: 3. 此时,类加载完毕,开始对象的初始化. 4. 对象的属性得到初值: 1> 基本值类型 默认值 2> 对象句柄为null 5.先执行基类初始化{ 1>先:属性定义时的初始化 2>后:执行构造器方法 }在执行衍生类初始化. 测试代码: package mytest; public class Test

Java继承类的初始化顺序

class Parent { // 静态变量 public static String p_StaticField = "父类--静态变量"; // 变量 public String p_Field = "父类--变量"; protected int i = 9; protected int j = 0; // 静态初始化块 static { System.out.println(p_StaticField); System.out.println("父类

java类的初始化顺序

java类的初始化顺序 (2008-10-21 13:30:15) 转载▼ 标签: java 初始化 继承初始化 it 分类: Java 对于静态变量.静态初始化块.变量.初始化块.构造器,它们的初始化顺序依次是(静态变量.静态初始化块)>(变量.初始化块)>构造器.我们也可以通过下面的测试代码来验证这一点: public class InitialOrderTest { // 静态变量 public static String staticField = "静态变量";

Java类的初始化

Java提供了两种不同的初始化类型,分别是类的初始化和对象的初始化.类成员都是静态的,默认会设置一个值.对象的初始化会在构造函数里面进行.但如果想要赋给静态变量非默认值,或者是初始化一类共有的对象属性(不论调用哪个构造函数),那么就需要一些特殊的方法.提供了静态初始化块和非静态初始化块来处理这两种情况. 静态初始化块 静态初始化块是通过static{}来定义的.一个简单的代码示例如下: public class CorderStatic { staticint idx; static{ Syst

《深入理解java虚拟机》:类的初始化

深入理解java虚拟机>:类的初始化 类从被加载到虚拟机内存中开始,到卸载出内存为止,它的整个生命周期包括:加载.验证.准备.解析.初始化.使用和卸载七个阶段.其中验证.准备.解析3个部分统称为连接.类加载的过程包括了加载.验证.准备.解析.初始化五个阶段. 加载.验证.准备.初始化和卸载这5个阶段的顺序时确定的,类的加载过程必须按照这种顺序按部就班的开始,而解析阶段则不一定,它在某些情况下可以在初始化阶段之后开始,这是为了支持Java语言的运行时绑定(也成为动态绑定或晚期绑定).另外注意这里的

深入理解Java对象的创建过程:类的初始化与实例化

"-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd"> 深入理解Java对象的创建过程:类的初始化与实例化 - Rico's Blogs - 博客频道 - CSDN.NET Rico's Blogs 潜心修炼,成为一个更好的人. 目录视图 摘要视图 订阅 [活动]2017 CSDN博客专栏评选 &nbsp [5月书讯]流畅

Java 反射 类的连接与初始化 [ 转载 ]

Java类的连接与初始化 (及2013阿里初始化笔试题解析) 转自http://www.cnblogs.com/iceAeterNa/p/4876747.html Java虚拟机通过装载.连接.初始化来使得一个Java类型可以被Java程序所使用,如下图所示,其中连接过程又分为验证.准备.解析三个部分.其中部分类的解析过程可以推迟到程序真正使用其某个符号引用时再去解析.   解析过程可以推迟到类的初始化之后再进行,但这是有条件的,Java虚拟机必须在每个类或接口主动使用时进行初始化. 以下为主动

java类的初始化和对象的创建顺序

学习java编程思想--类的初始化p146 类的加载顺序* 1加载器启动找到 xxx.class文件,通过extends关键字寻找基类,先加载基类* 2类初始化先初始化static成员变量和static--->* 2先初始化父类的static成员变量和static* 3再初始化本类的static成员变量和static * 类加载之后,对象创建开始* 1先加载父类的非静态成员变量(静态成员变量在类初始化的时候已经加载,非静态成员变量要随对象的创建而初始化)* 2先加载父类的构造函数* 3再加载本类

Java虚拟机 - 类初始化

[深入Java虚拟机]之三:类初始化 类初始化是类加载过程的最后一个阶段,到初始化阶段,才真正开始执行类中的Java程序代码.虚拟机规范严格规定了有且只有四种情况必须立即对类进行初始化: 遇到new.getstatic.putstatic.invokestatic这四条字节码指令时,如果类还没有进行过初始化,则需要先触发其初始化.生成这四条指令最常见的Java代码场景是:使用new关键字实例化对象时.读取或设置一个类的静态字段(static)时(被static修饰又被final修饰的,已在编译期