先看程序:

 package init_cls;

 class A{

     {System.out.println("i am in the class A!");}
static { System.out.println("static is the class A");}
}
public class init_cls {
{System.out.println("i am in the init_cls");}
static{System.out.println("i am static in the init_cls class");}
public static void main(String[] args) {
// TODO Auto-generated method stub A a=new A();
init_cls c=new init_cls();
} }

运行结果为:

i am static in the init_cls class
static is the class A
i am in the class A!
i am in the init_cls

从结果中可以看到,当我们只是使用一个类中的方法的时候(在这里使用的init_cls中的main),只初始化静态变量,所以最先输出:i am static in the init_cls class

之后当实例化一个类A的时候,先初始化其中的静态域static ,所以输出:static is the class A

之后初始化非静态域,所以输出:i am in the class A!

最后,只有当我们实例化init_cls类的时候,才初始化了类A中的非静态域,有了输出:i am in the init_cls

类是在任何static成员被访问时候被加载的,构造器也属于static方法,每个类被加载前都会先加载其基类。

这些和python中的初始化顺序非常不同,在python中加载一个包的时候,会从上到下全部初始化,遇到语句时候全部执行

顺便看一个java版的单例模式:

 public class singleton {
private singleton(){System.out.println("created!");}
private static singleton obj=new singleton();
public static singleton create(){
return obj;
} public static void main(String[] args) {
// TODO Auto-generated method stub
singleton s1 = singleton.create();
singleton s2 = singleton.create();
System.out.println(s1==s2);
}
}

其中,第3行obj要用static就是因为类singleton没有实例化,obj也就没有初始化,那么create()中就没有obj可以return,但是如果obj为static的话,在main()中,用

singleton.create()之前,就会先把obj初始化。

类是在任何static成员被访问时候被加载的,构造器也属于static方法,每个类被加载前都会先加载其基类。

那么在继承结构中的初始化顺序是怎么样的?

 class JC1{
{System.out.println("3");}
static {System.out.println("1");}
}
class JC2 extends JC1{
{System.out.println("4");}
static {System.out.println("2");}
}
public class jicheng { public static void main(String[] args) {
// TODO Auto-generated method stub
JC2 jc = new JC2();
} }

输出结果:

 1
2
3
4

可以看书,在继承结构中,先初始化基类-子类的静态变量,再初始化基类-子类的非静态变量

参考资料:thinking in java

[java] java中的初始化顺序的更多相关文章

  1. java类中元素初始化顺序

    结论:对于静态变量.静态初始化块.变量.初始化块.构造器,它们的初始化顺序依次是(静态变量.静态初始化块)>(变量.初始化块)>构造器. public class Test4 { @Tes ...

  2. java继承中的初始化顺序

    初始化顺序:父类的静态变量-->父类的静态代码块-->子类的静态变量-->子类的静态代码快-->父类的非静态变量(父类的非静态代码块)-->父类的构造函数-->子类 ...

  3. java类中元素初始化顺序详解

    父类静态变量父类静态块子类静态变量子类静态块父类普通变量父类普通块父类构造方法子类普通变量子类普通块子类构造方法

  4. Java类继承关系中的初始化顺序

    Java类初始化的顺序经常让人犯迷糊,现在本文尝试着从JVM的角度,对Java非继承和继承关系中类的初始化顺序进行试验,尝试给出JVM角度的解释. 非继承关系中的初始化顺序 对于非继承关系,主类Ini ...

  5. Java中的初始化顺序(静态成员、静态初始化块,普通成员、普通初始化块、构造函数)

    本文链接    http://blog.csdn.net/xiaodongrush/article/details/29170099 參考文章     http://my.oschina.net/le ...

  6. Java 类成员的初始化顺序

    Java 类成员的初始化顺序 前言:开发中碰到一个Java文件中有很多的成员变量,包括静态和非静态的,还有很多的初始化方法,很好奇这些成员的初始化顺序,在这里作个研究.   1  无继承情况下的Jav ...

  7. java类的成员初始化顺序和初始化块知识

    java类的成员初始化顺序和初始化块知识 转自:http://blog.csdn.net/lgfeng218/article/details/7606735 属性.方法.构造方法和自由块都是类中的成员 ...

  8. Java静态方法,静态变量,初始化顺序

    1. 静态方法: 成员变量分为实例变量和静态变量.其中实例变量属于某一个具体的实例,必须在类实例化后才真正存在,不同的对象拥有不同的实例变量.而静态变量被该类所有的对象公有(相当于全局变量),不需要实 ...

  9. Java类的成员初始化顺序

    Java类的成员初始化顺序 2017-06-01 代码: public class InitializeSequence { public static void main(String[] args ...

随机推荐

  1. Linux常用的20个命令

    以下为20个命令 1.ls命令:ls命令式列出目录内容(List Directory Contents)的意思.运行它就是列出文件夹里面的内容,可能是文件也可能是文件夹. root@tecmint:~ ...

  2. 【CodeForces】700 D. Huffman Coding on Segment 哈夫曼树+莫队+分块

    [题目]D. Huffman Coding on Segment [题意]给定n个数字,m次询问区间[l,r]的数字的哈夫曼编码总长.1<=n,m,ai<=10^5. [算法]哈夫曼树+莫 ...

  3. c++刷题(12/100)无序数组中和为定值的最长子数组

    题目一: 最短无序连续子数组 给定一个整数数组,你需要寻找一个连续的子数组,如果对这个子数组进行升序排序,那么整个数组都会变为升序排序. 你找到的子数组应是最短的,请输出它的长度. 示例 1: 输入: ...

  4. CentOS Linux 7 安装教程

    建立新的虚拟机 将CentOS 7 ISO文件插入到CD-Rom 启动虚拟机,F12选择启动方式为CD/DVD 选择Install CentOS Linux 7 加载安装必要文件 选择安装过程所显示的 ...

  5. host映射方法

    host映射: host是根据TCP/IP for Windows 的标准来工作的,它的作用是包含IP地址和Host name(主机名)的映射关系,是一个映射IP地址和Host name(主机名)的规 ...

  6. QByteArray储存二进制数据(包括结构体,自定义QT对象)

    因为利用QByteArray可以很方便的利用其API对内存数据进行访问和修改, 构建数据库blob字段时必不可少; 那如何向blob内写入自定义的结构体和类 //自定义person结构体 typede ...

  7. jQuery选择器——(三)

    1.基本元素选择器 id选择器:$(“#id名称”); 元素选择器:$(“元素名称”); 类选择器:$(“.类名”); 通配符:* 多个选择器共用(并集) 2.层级选择器 ancestor desce ...

  8. python基础-类的起源

    Python中一切事物都是对象. class Foo(object): def __init__(self,name): self.name = name f = Foo("alex&quo ...

  9. Shell脚本系列教程二: 开始Shell编程

    Shell脚本系列教程二: 开始Shell编程 2.1 如何写shell script? (1) 最常用的是使用vi或者mcedit来编写shell脚本, 但是你也可以使用任何你喜欢的编辑器; (2) ...

  10. Git 撤销操作、删除文件和恢复文件

    大致介绍 经过前面的学习,已经建立了版本库,并上传了文件,这次来学习对这些文件进行基本的操作,即: ◆ 撤销操作 ◆ 删除文件 ◆ 恢复文件 我在此之前,已经将三个文件提交到了版本库 撤销操作 撤销操 ...