博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
0023 Java学习笔记-面向对象-初始化代码块
阅读量:5014 次
发布时间:2019-06-12

本文共 2076 字,大约阅读时间需要 6 分钟。

初始化代码块

  • 在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;    }}

转载于:https://www.cnblogs.com/sonng/p/6073918.html

你可能感兴趣的文章
!!注意!部署出现the requested resource is not available
查看>>
华为OJ平台——矩阵乘法
查看>>
Shell脚本学习
查看>>
[GO]结构体成员的使用:指针变量
查看>>
C和指针 第十七章 经典数据类型 堆栈 队列 二叉树
查看>>
二叉树(简单版)
查看>>
eclipse中添加配置文件夹config
查看>>
1、计算机可以解决问题的三种途径
查看>>
2、什么是建模和有哪些模型
查看>>
git push 时的一个问题
查看>>
Dialog 窗口 滚动条
查看>>
maven中的setting文件
查看>>
小明系列故事――女友的考验 HDU - 4511 AC自动机+简单DP
查看>>
2019 Multi-University Training Contest 6 Snowy Smile (最大字段和变形)
查看>>
POJ 1743-POJ - 3261~后缀数组关于最长字串问题
查看>>
2019 Multi-University Training Contest 6 Nonsense Time (纯暴力)
查看>>
Spoj-DISUBSTR - Distinct Substrings~New Distinct Substrings SPOJ - SUBST1~(后缀数组求解子串个数)...
查看>>
2019 Multi-University Training Contest 7 Kejin Player Final Exam
查看>>
POJ - 2406 ~SPOJ - REPEATS~POJ - 3693 后缀数组求解重复字串问题
查看>>
POJ - 2778 ~ HDU - 2243 AC自动机+矩阵快速幂
查看>>