初始化代码块

  • 在18篇-类的基本要素中说到,类的三大成员:成员变量、构造方法、方法,初始化代码块是类的第4个成员
  • 初始化块用于对类或者对象的初始化,
  • 一个类的初始化块可以有0~多个,按先后顺序执行
  • 跟实例方法-->类方法、实例变量-->类变量一样,也可以用static修饰初始化块,静态初始化块-->非静态初始化块
  • 初始化块总是先于构造器执行
  • 非静态初始化块
    • 非静态初始化块相当于是对构造器的补充,用于创建对象时给对象的初始化,在构造器之前执行
    • 如果一段初始化代码对所有构造器完全相同,且无需接收参数,那就可以将其提取到非静态初始化代码块中
    • 在继承中,先后执行父类A的非静态块、构造器,再执行父类B的非静态块、构造器,最后才执行子类的非静态块、构造器
    • 实际上,经过编译后,非静态块已经添加到构造器中,且位于所有构造器代码的前面
  • 静态初始化块
    • 静态初始化块用static修饰,又叫类初始化块
    • 非静态块负责对对象执行初始化,而类初始化块负责对类进行初始化,因此类初始化块是在类初始化阶段就执行
    • 静态块跟静态方法一样,不能访问非静态成员
    • 在继承中,先后执行父类A的静态块,父类B的静态块,最后子类的静态块,然后再执行父类A的非静态块和构造器,然后是B类,最后执行子类的非静态块和构造器
    • 因为静态块是在类的初始化阶段完成的,因此在创建某个类的第二个对象时,该类的静态块就不会执行了
  • 下面通过一段代码,看看继承中的静态块、非静态块、构造方法的执行顺序
public class Test{
public static void main(String[] args) {
C c1=new C();
System.out.println("--------下面第二次创建C类对象---------");
C c2=new C();
}
}
class C extends B{
static {
System.out.println("C的静态代码块");
} {
System.out.println("C的非静态代码块");
} C(){
System.out.println("C的无参构造方法");
} C(String str){
System.out.println("C的有参构造方法");
}
}
class B extends A{
static {
System.out.println("B的静态代码块");
} {
System.out.println("B的非静态代码块");
} B(){
System.out.println("B的无参构造方法");
} B(String str){
System.out.println("B的有参构造方法");
}
}
class A{
static {
System.out.println("A的静态代码块");
} {
System.out.println("A的非静态代码块");
} A(){
System.out.println("A的无参构造方法");
} A(String str){
System.out.println("A的有参构造方法");
}
}

输出为:

A的静态代码块

B的静态代码块

C的静态代码块

A的非静态代码块

A的无参构造方法

B的非静态代码块

B的无参构造方法

C的非静态代码块

C的无参构造方法

--------下面第二次创建C类对象---------

A的非静态代码块

A的无参构造方法

B的非静态代码块

B的无参构造方法

C的非静态代码块

C的无参构造方法

静态初始化块与静态成员变量的执行顺序

  • JVM第一次使用某个类时,在准备阶段给所有静态成员分配内存,在初始化阶段初始化这些静态成员变量,就是执行初始化代码或者声明成员变量时指定的初始值,执行顺序与源代码中的顺序相同
  • 按源代码中的先后顺序执行,见示例代码:
public class Test{
public static void main(String[] args) {
A a=new A(); System.out.println(a.num); //输出10,而不是6,说明先执行声明赋值6,然后才执行静态块赋值10
}
}
class A{
public static int num=6; static{
num=10;
}
}

0023 Java学习笔记-面向对象-初始化代码块的更多相关文章

  1. 0037 Java学习笔记-多线程-同步代码块、同步方法、同步锁

    什么是同步 在上一篇0036 Java学习笔记-多线程-创建线程的三种方式示例代码中,实现Runnable创建多条线程,输出中的结果中会有错误,比如一张票卖了两次,有的票没卖的情况,因为线程对象被多条 ...

  2. Java学习笔记 - 类方法与代码块的执行顺序

    类的初始化顺序 使用一个简单的父子类例子来做示范,代码执行顺序在代码后有标注. class Parent { public static String p_StaticField = "父类 ...

  3. 0013 Java学习笔记-面向对象-static、静态变量、静态方法、静态块、单例类

    static可以修饰哪些成员 成员变量---可以修饰 构造方法---不可以 方法---可以修饰 初始化块---可以修饰 内部类(包括接口.枚举)---可以修饰 总的来说:静态成员不能访问非静态成员 静 ...

  4. 0025 Java学习笔记-面向对象-final修饰符、不可变类

    final关键字可以用于何处 修饰类:该类不可被继承 修饰变量:该变量一经初始化就不能被重新赋值,即使该值跟初始化的值相同或者指向同一个对象,也不可以 类变量: 实例变量: 形参: 注意可以修饰形参 ...

  5. 0028 Java学习笔记-面向对象-Lambda表达式

    匿名内部类与Lambda表达式示例 下面代码来源于:0027 Java学习笔记-面向对象-(非静态.静态.局部.匿名)内部类 package testpack; public class Test1{ ...

  6. 0030 Java学习笔记-面向对象-垃圾回收、(强、软、弱、虚)引用

    垃圾回收特点 垃圾:程序运行过程中,会为对象.数组等分配内存,运行过程中或结束后,这些对象可能就没用了,没有变量再指向它们,这时候,它们就成了垃圾,等着垃圾回收程序的回收再利用 Java的垃圾回收机制 ...

  7. 程序设计基础·Java学习笔记·面向对象(下)

    Java程序设计基础之面向对象(下) (补充了上的一些遗漏的知识,同时加入了自己的笔记的ヾ(•ω•`)o) (至于为什么分P,啊大概是为了自己查笔记方便(?)应该是("` 3′") ...

  8. 0024 Java学习笔记-面向对象-包装类、对象的比较、String常量池问题

    包装类 基本类型-->包装类 byte-->Byte short-->Short int-->Integer long-->Long char-->Characte ...

  9. 0020 Java学习笔记-面向对象-变量

    变量分为哪些 成员变量:类里面,方法外面定义的变量 实例变量:没有用static修饰的变量,属于对象:存在期:创建实例-销毁实例:作用域:与该实例的生存范围相同 类变量:用static修饰的变量,属于 ...

随机推荐

  1. 前端项目构建之yeoman

    各位好啊,我又和大家见面了,也许你已经不记得大明湖畔的容嬷嬷,但是只要记得博客园中的我就好,希望我的博客能像一股清风,为你驱散炎热的酷暑,好了,废话不多说,开始上干货,我今天带给大家的是前端工程化开发 ...

  2. 深入理解javascript原型和闭包系列

    从下面目录中可以看到,本系列有16篇文章,外加两篇后补的,一共18篇文章.写了半个月,从9月17号开始写的.每篇文章更新时,读者的反馈还是可以的,虽然不至于上头条,但是也算是中规中矩,有看的人,也有评 ...

  3. jQuery-1.9.1源码分析系列(十一) DOM操作

    DOM操作包括append.prepend.before.after.replaceWith.appendTo.prependTo.insertBefore.insertAfter.replaceAl ...

  4. Final Cut Pro X效果插件开发总结

    一.介绍 最近公司需要针对Final Cut Pro(FCP)开发一款效果插件,用于对公司自己开发的视频格式进行后期处理.Final Cut Pro是苹果公司推出的一款视频剪辑软件,因此需要在OSX平 ...

  5. XmlReader和XElement组合之读取大型xml文档

    简介 在.NET framework 中存在大量操作xml数据的类库和api,但在.NET framework 3.5后我们的首选一般就是linq to xml. linq to xml操作xml数据 ...

  6. 关于在aspx前台使用后台变量的问题

    我们经常会在后台定义一个变量,然后在用<%=变量名%>这种方式去获取,但是有时候<head></head>里面获取变量的时候,有时候会获取不到是怎么回事呢 前台: ...

  7. js补充小知识点(continue,break,ruturn)

    1.continue,break,ruturn eg:1-100的和 $(function () { $("#hello").click(function () { var iNu ...

  8. assign()

  9. CSS3学习总结

    (写在前边~)过了这么长时间,才写博客,最近实在是太忙了,做了两个项目,一个项目用于练手,自我感觉做的很漂亮,一个项目是一套完整的页面体系,答辩时候老师给了100分和99分,并让我打包上传,我很是感动 ...

  10. Integer.valueof(String s)和Integer.parseInt(String s)的具体区别是什么?

    Integer.valueof(String s)和Integer.parseInt(String s)的具体区别是什么? Integer.valueof(String s)是将一个包装类是将一个实际 ...