一、一个类的初始化顺序(没继承情况)

 规则:

1.静态变量>普通变量>构造方法

  2.变量定义的顺序决定初始化的顺序

3.静态变量和静态块是一样的,普通变量和非静态块是一样的,即能够把静态块看作是静态变量。把非静态块看作是普通变量

public class Test1 {
public static void main(String[] args) {
new D();
}
} class C{
public C(String s){
System.out.println(s);
}
} class D{
/* D的构造方法 */
public D(){
System.out.println("D的构造方法");
} /* D的非静态变量 */
private C c1 = new C("变量1");
private C c2 = new C("变量2"); /* D的静态变量 */
private static C c3 = new C("静态变量1");
private static C c4 = new C("静态变量2"); /* D的静态初始化块 */
static{
System.out.println("D的静态初始化块。 。");
} /* D的实例初始化块 */
{
System.out.println("D的实例初始化块。。");
}
}

运行结果:

静态变量1

静态变量2

D的静态初始化块。

变量1

变量2

D的实例初始化块。



D的构造方法

二、一个类的初始化顺序(有继承情况)

规则:

  1.父类的初始化>子类的初始化

  2.静态变量>普通变量>构造方法

  3.变量定义的顺序决定初始化的顺序

  4.静态变量和静态块是一样的,普通变量和非静态块是一样的。即能够把静态块看作是静态变量,把非静态块看作是普通变量

public class Test2 {

	public static void main(String[] args) {
new B();
}
} class Feild{
public Feild(String s){
System.out.println(s);
}
} class A{
/* A的构造方法 */
public A(){
System.out.println("父类的构造方法");
} /* A的非静态变量 */
private Feild f1 = new Feild("父类变量1");
private Feild f2 = new Feild("父类变量2"); /* A的静态变量 */
private static Feild f3 = new Feild("父类静态变量1");
private static Feild f4 = new Feild("父类静态变量2"); /* A的静态初始化块 */
static{
System.out.println("父类的静态初始化块。。 ");
} /* A的实例初始化块 */
{
System.out.println("父类的实例初始化块。 。");
}
} class B extends A{
/* B的构造方法 */
public B(){
System.out.println("子类的构造方法");
} /* B的非静态变量 */
private Feild f5 = new Feild("子类变量1");
private Feild f6 = new Feild("子类变量2"); /* B的静态变量 */
private static Feild f7 = new Feild("子类静态变量1");
private static Feild f8 = new Feild("子类静态变量2"); /* B的静态初始化块 */
static{
System.out.println("子类的静态初始化块。。");
} /* B的实例初始化块 */
{
System.out.println("子类的实例初始化块。。");
}
}

运行结果:

父类静态变量1

父类静态变量2

父类的静态初始化块。。

子类静态变量1

子类静态变量2

子类的静态初始化块。。

父类变量1

父类变量2

父类的实例初始化块。。

父类的构造方法

子类变量1

子类变量2

子类的实例初始化块。。

子类的构造方法

以下再看一个样例:

public class Test1 {
public static void main(String[] args) {
new D();
}
} class D{
/* D的构造方法 */
public D(){
System.out.println("D的构造方法");
} public D(String s){
System.out.println(s);
} /* D的非静态变量 */
private static D d1 = new D("变量1");
private static D d2 = new D("变量2"); /* D的静态初始化块 */
static{
System.out.println("D的静态初始化块。 。");
} /* D的实例初始化块 */
{
System.out.println("D的实例初始化块。 。 ");
}
}

输出结果为:

D的实例初始化块。。

变量1

D的实例初始化块。。

变量2

D的静态初始化块。



D的实例初始化块。

D的构造方法

解析:由于new D()时,类D里面会创建两个实例。而又由于静态块的位置在两个实例创建的后面,所以不会先输出静态块的内容。而是创建了两个实例d1、d2后,再new D()。这时才运行静态块、实例块、构造方法。

以下将静态块移到d1和d2创建之前:

public class Test1 {
public static void main(String[] args) {
new D();
}
} class D{
/* D的构造方法 */
public D(){
System.out.println("D的构造方法");
} public D(String s){
System.out.println(s);
} /* D的静态初始化块 */
static{
System.out.println("D的静态初始化块。 。");
} /* D的非静态变量 */
private static D d1 = new D("变量1");
private static D d2 = new D("变量2"); /* D的实例初始化块 */
{
System.out.println("D的实例初始化块。。 ");
}
}

输出结果例如以下:

D的静态初始化块。。

D的实例初始化块。

变量1

D的实例初始化块。。

变量2

D的实例初始化块。。

D的构造方法

Java中类的初始化顺序的更多相关文章

  1. 图示Java类的初始化顺序

    Java类的初始化顺序   在开发中,知道Java类的初始化顺序才能让我们更加清楚地掌握程序的执行流程.先把结论贴出来,Java里,从图里的1~6,分别按顺序执行.   以下为代码验证阶段,一共三个类 ...

  2. java创建对象 的初始化顺序

    java创建对象 的初始化顺序 1.初始化块 初始化块通常写在类的构造方法之前,由花括号括起来,通常包含对成员属性进行初始化的语句: 初始化块分为instance初始化块和static初始化块,初始化 ...

  3. Java学习笔记二十三:Java的继承初始化顺序

    Java的继承初始化顺序 当使用继承这个特性时,程序是如何执行的: 继承的初始化顺序 1.初始化父类再初始子类 2.先执行初始化对象中属性,再执行构造方法中的初始化 当使用继承这个特性时,程序是如何执 ...

  4. java类的初始化顺序

    在java中,当我们new一个对象时,对象中的成员,初始化块以及构造方法的加载是有一定的顺序的,看下面一副图: 一.单类(无基类)下的初始化顺序: public class Parent { stat ...

  5. java中类的初始化和对象的初始化

    静态的属于全局静态区,这个部分独立存在,不管是成员还是块,都是静态的,大家地位相等,先到先得. 然后是成员初始化,这个部分在类的构造函数前初始化,因为编译器(或者设计者)可能认为构造函数调用了这个成员 ...

  6. 【软件构造】-<笔记>-浅谈java中类的初始化过程

    编写java程序时,每创建一个新的对象,都会对对象的内容进行初始化. 每一个类的方法中的局部变量都有严格的初始化要求,因此假如写出下面的程序: void f(){ int i; i++; } 编译时就 ...

  7. [java] java中的初始化顺序

    先看程序: package init_cls; class A{ {System.out.println("i am in the class A!");} static { Sy ...

  8. Java类的初始化顺序 (静态变量、静态初始化块、变量、初始...

    很有意思的一篇文章 1.没有继承 静态变量->静态初始化块->变量->变量初始化块->构造方法 2.有继承的情况 父类静态变量->父类静态初始化块->子类静态变量- ...

  9. Java中的初始化顺序

    一.在创建类时为成员变量赋值和在构造函数中的赋值的先后顺序  在未用构造器之前其实已经将类的字段进行了赋值只是在调用构造器时,又将类的字段进行了重新的赋值.如下: package com.cjm.in ...

随机推荐

  1. 【DWT笔记】傅里叶变换与小波变换

    [DWT笔记]傅里叶变换与小波变换 一.前言 我们经常接触到的信号,正弦信号,余弦信号,甚至是复杂的心电图.脑电图.地震波信号都是时域上的信号,我们也成为原始信号,但是通常情况下,我们在原始信号中得到 ...

  2. Hadoop-- MapReduce简单理解

    1.Hadoop和MapReduce概念 Mapreduce是一种模式. Hadoop是一种框架. Hadoop是一个实现了mapreduce模式的开源的分布式并行编程框架. 2.Hadoop框架   ...

  3. AudioManager --- generateAudioSessionId

    AudioManager中的generateAudioSessionId方法介绍: 1.方法声明 pubilc void generateAudioSessionId(); 2.API描述 返回一个不 ...

  4. flex之组件简单应用

    1. 将父窗体的内容传递给子窗体: 2.将子窗体内容传递给父窗体:即用户名和密码,t1是父窗体文本框id.

  5. 客户端无法tcp连接上本地虚拟机的问题(最后是linux防火墙问题)

    刚装好裸的centos6.5,很多东西跟以前比都是没有的,所以做起来会遇到很多问题. 今天刚把svn 无法ci的问题解决了,起完服后,发现客户端连不上. 1)端口转发,查看了一下虚拟机的端口转发,发现 ...

  6. [POJ] #1005# I Think I Need a Houseboat : 浮点数运算

    一. 题目 I Think I Need a Houseboat Time Limit: 1000MS   Memory Limit: 10000K Total Submissions: 97512 ...

  7. koa 笔记 运行错误

    按照 演示的代码 直接运行会出错,大家需要调整方式. http://koajs.cn/ 要安装以下 $ npm install -g n$ n 0.11.12$ node --harmony my-k ...

  8. 如何通过Android Studio发布library到jCenter和Maven Central

    http://www.jianshu.com/p/3c63ae866e52# 在Android Studio里,如果你想引入任何library到自己的项目中,只需要很简单的在module的build. ...

  9. 前端复习-03-接上面ajax跨域问题的解决与探索

    废话不多少 ..我估计一万个人都搞不清楚 什么是跨域 然后就被这堵墙无情的挡住了..我尝试了很多办法解决这个问题.后来再慕课网上的一个老师的ppt那里看到一张图 我觉得 能记住这张图的话 应该就算是深 ...

  10. mysql系统表加trigger和对特定的库禁用 DDL 语句

    给 mysql 系统表加上 trigger 1 Reply 默认情况下,mysql 是不能给系统表,例如 mysql.user 加上触发器的.会提示 ERROR 1465 (HY000): Trigg ...