先说明一下由来吧,下面是同学的一道笔试题,以前感觉对java初始化也是了解一二的,结果,看到这题泪奔了,不会。。。上网查,自己添加println,总算是能把自己讲明吧了,不知理解的对不对,先记录下吧,也许以后再看,会发现这真是。。。幼稚

public class StaticFunction {
public static int k = 0;
public static StaticFunction t1 = new StaticFunction("t1");
public static StaticFunction t2 = new StaticFunction("t2");
public static StaticFunction t3 = new StaticFunction("t1");
public static int i = print("i");
public static int n = 99;
public int j = print("j");
{
print("构造块");
System.out.println("t1:"+t1);
System.out.println("t2:"+t2);
System.out.println("j:"+j);
}
static {
print("静态块");
System.out.println("t1:"+t1);
System.out.println("t3:"+t3);
System.out.println("t1.t1:"+t1.t1);
System.out.println("t2.t1:"+t2.t1);
System.out.println("t3.t1:"+t3.t1);
System.out.println("t1.t1.t1:"+t1.t1.t1);
System.out.println("t1.t2:"+t1.t2);
System.out.println("t1.t2.t2:"+t1.t2.t2);
System.out.println("t2.t2.t2:"+t2.t1.t2);
if(t1 == t3)
System.out.println("t1 == t3");
} public StaticFunction(String str) {
System.out.println((++k) + ":" + str + " i=" + i + " n=" + n);
++i;
++n;
} private static int print(String str) {
System.out.println((++k)+":"+str+" i="+i+" n="+n);
++n;
return ++i;
} public static void main(String[] args) {
System.out.println("Start....");
StaticFunction t=new StaticFunction("init");
System.out.println("Over....");
//System.out.println("j:"+j);
} }

运行结果如图:

上面的说结果也是符合jvm加载类的一般步骤:

在Java中,类装载器把一个类装入Java虚拟机中,要经过三个步骤来完成:装载、链接和初始化,其中链接又可以分成校验、准备和解析三步,除了解析外,其它步骤是严格按照顺序完成的,各个步骤的主要工作如下:
装载:查找和导入类或接口的二进制数据;
链接:执行下面的校验、准备和解析步骤,其中解析步骤是可以选择的;
校验:检查导入类或接口的二进制数据的正确性;
准备:给类的静态变量分配并初始化存储空间;
解析:将符号引用转成直接引用;
初始化:激活类的静态变量的初始化Java代码和静态Java代码块。
初始化类中属性是静态代码块的常用用途,但只能使用一次。

按照上面的,在载入一个类的时候首先要做的是给它的静态变量分配存储空间,并设默认值(int等为0 object等为null),然后在按照声明(定义)静态变量的顺序,对其进行赋值。先是k = 0,然后t1 =new StaticFunction("t1");需要注意,一个类只载入一次,其静态变量是这个类共享的。所以开始执行 public int j = print("j");又因为此时n与i还处于默认值,所有输出为0即i = 0; n = 0。接着开始执行构造块,可以看到此时t1还是null,因为还没有执行构造函数,t1还没有初始化完毕,此时也就为null了,构造块之后便是构造函数了。还要注意的是现在还是执行的类中静态变量的初始化,还没有轮到静态块的执行。在t1,t2,n与i初始化之后才能执行static{};t2也是同样的操作,静态变量初始化完毕之后开始执行static{}。静态(类)操作完毕之后,开始main()。。。

Java 初始化的个人理解的更多相关文章

  1. Java初始化理解与总结 转载

    Java的初始化可以分为两个部分: (a)类的初始化 (b)对象的创建 一.类的初始化 1.1 概念介绍: 一个类(class)要被使用必须经过装载,连接,初始化这样的过程. 在装载阶段,类装载器会把 ...

  2. Java提高篇之理解java的三大特性——继承

    在<Think in java>中有这样一句话:复用代码是Java众多引人注目的功能之一.但要想成为极具革命性的语言,仅仅能够复制代码并对加以改变是不够的,它还必须能够做更多的事情.在这句 ...

  3. 【转】java提高篇(二)-----理解java的三大特性之继承

    [转]java提高篇(二)-----理解java的三大特性之继承 原文地址:http://www.cnblogs.com/chenssy/p/3354884.html 在<Think in ja ...

  4. Java类加载机制的理解

    算上大学,尽管接触Java已经有4年时间并对基本的API算得上熟练应用,但是依旧觉得自己对于Java的特性依然是一知半解.要成为优秀的Java开发人员,需要深入了解Java平台的工作方式,其中类加载机 ...

  5. 沉淀再出发:关于java中的AQS理解

    沉淀再出发:关于java中的AQS理解 一.前言 在java中有很多锁结构都继承自AQS(AbstractQueuedSynchronizer)这个抽象类如果我们仔细了解可以发现AQS的作用是非常大的 ...

  6. Java工厂模式解耦 —— 理解Spring IOC

    Java工厂模式解耦 -- 理解Spring IOC 最近看到一个很好的思想来理解Spring IOC,故记录下来. 资源获取方式 主动式:(要什么资源都自己创建) 被动式:(资源的获取不是我们创建, ...

  7. Java初始化过程

    这篇文章主要讲解Java在创建对象的时候,初始化的顺序.主要从以下几个例子中讲解: 继承关系中初始化顺序 初始化块与构造器的顺序 已经加载过的类的初始化顺序 加载父类,会不会加载子类 创建子类对象会不 ...

  8. Java初始化顺序

    package com.helei.init; class Log { public static String fatherStaticString(){System.out.println(&qu ...

  9. Java语言的个人理解

    Java语言的个人理解(比价深层次吧) 大四的生活确实十分的奢靡,不锻炼,不读书,几乎就是当一天和尚撞一天钟的生活,太颓废了,还好自己不是这个样子,不过身体确实差了很多,昨天跑了一圈内环(4KM),今 ...

随机推荐

  1. 一个证书多次使用-导出p12文件

    在苹果开发者网站申请的证书,是授权mac设备的开发或者发布的证书,这意味着一个设备对应一个证书,但是99美元账号只允许生成3个发布证书,两个开发证书,这满足不了多mac设备的使用,使用p12文件可以解 ...

  2. OC语法9——Category类别

    Category(分类): 当我们在开发过程中要给类添加新的方法时,一般不要去动原类. 再不改动原类的限制下,怎么拓展类的方法?以往我们的做法是新建子类使其继承该类,然后通过子类拓展类的行为. OC提 ...

  3. css负边距自适应布局

    单列定宽单列自适应布局: <!DOCTYPE HTML> <html> <head> <meta charset="UTF-8"> ...

  4. MySQL远程(IP)连接报错:Host 'IP地址' is not allowed to connect to this MySQL server

    ERROR 1130: Host ’192.168.1.3′ is not allowed to connect to this MySQL server这是告诉你没有权限连接指定IP的主机,下面我们 ...

  5. 走进C标准库(5)——"stdio.h"中的其他部分函数

    函数介绍来自:http://ganquan.info/standard-c/ 函数名: freopen 功  能: 替换一个流 用  法: FILE *freopen(char *filename, ...

  6. 18.java.lang.OutOfMemoryException

    java.lang.OutOfMemoryException内存不足错误 当可用内存不足以让Java虚拟机分配给一个对象时抛出该错误.

  7. Linux 内存机制详解宝典

    Linux 内存机制详解宝典 在linux的内存分配机制中,优先使用物理内存,当物理内存还有空闲时(还够用),不会释放其占用内存,就算占用内存的程序已经被关闭了,该程序所占用的内存用来做缓存使用,对于 ...

  8. 对web应用中单一入口模式的理解及php实现

    在我们web应用的开发中,经常会听见或看见单一入口模式,在我开始学习tp框架的时候也不理解为什么要运用一个单一入口模式,只是会使用,最近自己在搞一个小东西的时候才明白为什么在web开发中要运用单一入口 ...

  9. JAVA 中的RMI是什么

    RMI的概念 RMI(Remote Method Invocation)远程方法调用是一种计算机之间利用远程对象互相调用实现双方通讯的一种通讯机制.使用这种机制,某一台计算机上的对象可以调用另外 一台 ...

  10. 汉诺塔III 汉诺塔IV 汉诺塔V (规律)

    汉诺塔III Time Limit: 1000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others)Total Subm ...