由浅入深,首先,我们来看一下,一个类初始化有关的都有些啥米:

  静态成员变量、静态代码块、普通成员变量、普通代码块、构造器。(成员方法?貌似跟初始化没有啥关系)

现在我们来看看她们的初始化顺序,

  从性质上来说,静态的代表的是一个类的属性,普通的是一个对象的属性,“皮之不存,毛将焉附”,没有类,就没法谈对象,所以静态的必须先初始化。

那么静态成员变量与静态代码块之间又是什么关系呢?

  做了个实验,发现静态成员变量与静态代码块谁放前面谁先执行,但是!!!!注意!!!!这里说的是“执行”是指的把sx=10,这个10赋给sx,而不是sx的初始化,在实验2里在代码块中打断点,可以发现这个时候sx已经被初始化为0,这里我是这样理解的:既然在初始化这个类(或对象)的成员了,那说明已经给它分配好内存了,int分配好内存后默认值为0(基础类型的默认值有false,0,null),不知道这么理解对不对。所以最终的结论是,先初始化成员变量为默认值,然后根据成员变量与代码块的先后顺序进一步初始化。

实验代码如下:

//实验1
private static int sx = 10;
static{
System.out.println("execute static block");
} 与
//实验2
static{
System.out.println("execute static block");
}
private static int sx = 10;

  接着说,普通成员变量与普通代码块和静态的一个道理,就不累述了。

那么构造器与普通成员变量和普通代码块的关系呢?

  这个我是通过实验得了这么个结论,是成员变量的"=xxx"(和成员变量初始化为默认值区分)和代码块先执行,然后再执行构造器中的。(实验代码最后一并贴出)

ok到这里为止,一个类的我们简单的说完了,那么类还有继承呢,子类和父类结合到一起的时候又是什么一个顺序呢?

其实挺简单的,子类继承自父类,可以使用父类的非private成员,所以,在在初始化子类之前肯定是要先初始化父类。

最终的顺序是:

父类静态成员变量初始化为默认值—>

子类静态成员变量初始化为默认值—>

父类按出现的先后顺序执行静态成员变量的“=xxx”和静态代码块—>

子类的按出现的先后顺序执行静态成员变量的“=xxx”和静态代码块—>

父类普通成员变量初始化为默认值—>

子类普通成员变量初始化为默认值—>

父类按出现的先后顺序执行普通成员变量的“=xxx”和静态代码块—>

父类执行构造函数—>

子类的按出现的先后顺序执行普通成员变量的“=xxx”和静态代码块—>

子类执行构造函数—>end

实验代码:

package abstractClass;

@SuppressWarnings("unused")
abstract class AbstractDemo {
{
System.out.println("execute super block,this.x="+this.x);
}
static{
System.out.println("execute static super block,this.sx="+AbstractDemo.sx);
}
public static int SuperPS = 1;
private static int sx = 1;
private int x = 1; public AbstractDemo(){
super();
System.out.println("execute super constractor");
// this.print();
} public abstract void print();
} @SuppressWarnings("unused")
class DemoImpl extends AbstractDemo{
public static int PS = 10;
private static int sx = 10;
private int x = 10; //从调试的结果来看,此处是在执行完super()之后执行,然后再接着执行构造器
{
System.out.println("execute block,this.x="+this.x);
}
static{
System.out.println("execute static block,this.sx="+DemoImpl.sx);
}
public DemoImpl(int x){
super(); //断点
System.out.println("execute constractor");
System.out.println("before init in constractor this.x="+this.x);
this.x = x;
} @Override
public void print(){
System.out.println("this.x="+x);
}
} public class TestAbstractDemo{
public static void main(String[] args) {
new DemoImpl(100);
}
}

实验结果:

execute static super block,this.sx=0
execute static block,this.sx=10
execute super block,this.x=0
execute super constractor
execute block,this.x=10
execute constractor
before init in constractor this.x=10

java基础之——类的初始化顺序的更多相关文章

  1. Java笔记 #04# 类的初始化顺序补充

    参考java中的类的初始化顺序详解 package org.sample; class Bread { Bread() { System.out.println("Bread()" ...

  2. JAVA基础2——类初始化相关执行顺序

    类初始化相关执行顺序 几个概念说明 代码块的含义与作用 static静态代码块: 一般用于初始化类中的静态变量.比如:给静态的数组或者list变量赋初值.使用static静态代码块进行初始化与直接在定 ...

  3. java类的初始化顺序

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

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

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

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

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

  6. 第二十九节:Java基础知识-类,多态,Object,数组和字符串

    前言 Java基础知识-类,多态,Object,数组和字符串,回顾,继承,类的多态性,多态,向上转型和向下转型,Object,数组,多维数组,字符串,字符串比较. 回顾 类的定义格式: [类的修饰符] ...

  7. Java基础-Calendar类常用方法介绍

    Java基础-Calendar类常用方法介绍 作者:尹正杰 版权声明:原创作品,谢绝转载!否则将追究法律责任. 一.Calendar类概念 Calendar 类是一个抽象类,它为特定瞬间与一组诸如 Y ...

  8. Java&&(面试题)初始化顺序总结

    1  无继承情况下的Java初始化顺序: class Sample {       Sample(String s)       {             System.out.println(s) ...

  9. C#多态;父类引用指向子类对象;new和override的区别;new、abstract、virtual、override,sealed关键字区别和使用代码示例;c#类的初始化顺序

    关于父类引用指向子类对象 例如: 有以下2个类 public class Father { public int age = 70; public static string name = " ...

随机推荐

  1. 【leetcode】Word Ladder II

      Word Ladder II Given two words (start and end), and a dictionary, find all shortest transformation ...

  2. wxPython中文教程入门实例

    这篇文章主要为大家分享下python编程中有关wxPython的中文教程,分享一些wxPython入门实例,有需要的朋友参考下     wxPython中文教程入门实例 wx.Window 是一个基类 ...

  3. iOS 小经验:UIAnimation空对象导致crash

    今天调试一个老程序,发现有时运行动画会crash,仔细检查了基本的内存管理,发现都没问题!后来发现了问题,这个程序用的是下面的代码 [self performSelectorInBackground: ...

  4. 基于NHibernate的开发框架的设计

    上次的 NHibernate的Session管理策略和NHibernateHelper 发布并提供下载,给NHibernate刚入门的同学们带来很多便利. 最近有同学在求NH的通用仓储,正好我最近也设 ...

  5. 【python】正则中的group()

    来源:http://www.cnblogs.com/kaituorensheng/archive/2012/08/20/2648209.html 正则表达式中,group()用来提出分组截获的字符串, ...

  6. php数据访问(修改)

    修改:跟添加相似,需要显示默认值 先嵌入php代码  查询数据库 $code = $_GET["c"]; $db = new MySQLi("localhost" ...

  7. 22中编程语言的HelloWorld

    C:printf("HelloWorld"); C++ : cout<<"HelloWorld"; QBasic : Print "Hel ...

  8. [Android Pro] AAR and JAR

    svn status svn log --limit 3 > RELEASE_NOTE.txt cat RELEASE_NOTE.txt pwd project_name_prefix=&quo ...

  9. NYOJ题目170网络的可靠性

    aaarticlea/png;base64,iVBORw0KGgoAAAANSUhEUgAAAs8AAANvCAIAAACte6C6AAAgAElEQVR4nOydPbLcNhOu7yaUayGOZy

  10. NYOJ题目769乘数密码

    aaarticlea/png;base64,iVBORw0KGgoAAAANSUhEUgAAAsQAAAJYCAIAAADqk2fsAAAgAElEQVR4nO3dPVLrytbG8XcS5AyEWA