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

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

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

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

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

  做了个实验,发现静态成员变量与静态代码块谁放前面谁先执行,但是!!!!注意!!!!这里说的是“执行”是指的把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. mysql性能优化-简易版

    mysql性能优化 sql语句优化 如何发现有问题的sql? 开启mysql慢查询 show variables like 'slow_query_log' set global slow_query ...

  2. linux琐碎知识点

    1.awk的使用方式,pattern支持正则表达式 awk 'pattern{action}' {filenames} 其中 pattern 表示 AWK 在数据中查找的内容,而 action 是在找 ...

  3. 51 NOD 1384 全排列(STL 搜索)

    1384 全排列       基准时间限制:1 秒 空间限制:131072 KB 分值: 0 难度:基础题        收藏        关注   给出一个字符串S(可能又重复的字符),按照字典序 ...

  4. mybatis新增数据后获取自增主键

    mybatis对应mysql <insert id="insert" parameterType="com.timestech.wsgk.web.model.Sys ...

  5. unbutu下搭建FTP服务

    安装 apt-get install vsftpd 启动 service vsftpd start 第一次连接的时候出了点问题,报了一个 login incorrect 530的连接错误 然后百度了一 ...

  6. $.each 和$(selector).each()的区别

    $.each() 对数组或对对象内容进行循环处理 jQuery.each( collection, callback(indexInArray, valueOfElement) ) collectio ...

  7. iOS - iPhone开发 UILocalNotification的使用

    OS下的Notification的使用 Notification 是智能手机应用编程中非常常用的一种传递信息的机制,而且可以非常好的节省资源,不用消耗资源来不停地检查信息状态(Pooling),在iO ...

  8. IOS-ARC和垃圾回收机制

    ARC是编译层面的东西,垃圾回收是程序运行以后的机制,两者不可混为一谈 苹果觉得垃圾回收这种严重影响电源使用效率的特性,同移动设备天生的实时性是相冲突的.但是在iOS 5当中苹果引入了自动内存管理机制 ...

  9. [Android Pro] DES加密 version1

    reference to : http://blog.csdn.net/wfung_kwok/article/details/7766029 加密和解密要用同一個key AES: import jav ...

  10. 群内大神与你交流WEB经验 业内专家指点就职技巧

    就知道你是一个有理想要抱负的人,不会满足于做一个初级的前端开发工程师.在接下来的这个阶段,我们将走上前端开发的进阶之路,将自己的能力再往上拔高一个等级.同样,薪资也会往上升一个等级!但是,如果你是一个 ...