• Java代码块


    • 类的三大成员:成员变量、构造方法、方法,初始化代码块是类的第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;
        }
    }

     

     
     
  • 相关阅读:
    BZOJ4552 Tjoi2016&Heoi2016排序 【二分+线段树】*
    BZOJ4547 Hdu5171 小奇的集合 【矩阵快速幂优化递推】
    BZOJ1113 Poi2008 海报PLA【单调栈】【水】
    BZOJ1510 POI2006 Kra-The Disks 【模拟】
    BZOJ 2530 Poi2011 Party 【枚举】
    BZOJ4292 PA2015 Równanie 【暴力水题】
    BZOJ1801 Ahoi2009 chess 中国象棋 【DP+组合计数】*
    【干货】高精度模板【加,减,乘,快速幂】
    BZOJ1220 HNOI2002 跳蚤 【容斥原理+高精度】*
    BZOJ1412 ZJOI2009 狼和羊的故事 【网络流-最小割】
  • 原文地址:https://www.cnblogs.com/guanghe/p/9064401.html
Copyright © 2020-2023  润新知