• 面向对象---静态初始化块,普通初始化块,构造器的加载顺序


    初始化块:

      包括静态初始化块和普通初始化块。

      初始化块初是构造器的补充,初始化块总在构造器之前执行。

      初始化块的修饰词只能是static。

      系统可以使用初始化块来进行对象的初始化操作。

    基本用法:

      如果有一段初始化处理代码对所有对象完全相同,且无需接收任何参数,就可把这段初始化处理代码提取到初始化中去。

    优点:

      提高初始化代码的复用,提高应用的维护性。

    下面代码主要说明静态初始化块,普通初始化块,构造器的加载顺序:

    /**
     * 
     * @author wuyong
     * @email 382999338@qq.com
     * @date2016年10月29日下午4:13:45
     */
    //三个继承关系的类
    public class A {
        static{
            System.out.println("A的静态初始化块");
        }
        {
            System.out.println("A的普通初始化块");
        }
        public A() {
            System.out.println("A的无参构造器");
        }
    }
    
    
    public class B extends A{
    
        static{
            System.out.println("B的静态初始化块");
        }
        {
            System.out.println("B的普通初始化块");
        }
        public B() {
            System.out.println("B的无参构造器");
        }
        public B(String string) {
            //通过this调用本类中的重载的构造器
            this();
            System.out.println("B的有参构造器,他的参数构造值string="+string);
        }
    
    }
    
    
    public class C extends B{
        static{
            System.out.println("C的静态初始化块");
        }
        {
            System.out.println("C的普通初始化块");
        }
        public C() {
            super("传入B有参构造器的的参数");
            System.out.println("C的无参构造器");
        }
        
        /*
         * 初始化化块、构造器在继承关系的执行顺序:
         * 都不仅会执行本类中的初始化化块、构造器,
         * 也会上溯到Object类,先执行Object的初始
         * 化化块、构造器,然后在执行其父类的。。。
         * 最后才会执行自身的初始化化块、构造器。
         * 
         * 
         * 第一次创建C对象,因为系统中还不存在C类,因此需要先加载并初始化C类,
         * 初始化C类时会先执行其顶层的父类的静态初始化块,在执行其直接父类的
         * 静态初始化块,最后在执行C本身的静态初始化块。
         * C类初始化成功后,C类在该虚拟机里将一直存在,所以第二次创建C类的对象
         * 时不要在在对C类进行初始化,就不要再执行静态初始化块。
         * 
         */
        public static void main(String[] args) {
            System.out.println("第一次创建C的对象----");
            new C();
            System.out.println("第二次创建C的对象----");
            new C();
        }
        /*
         * 输出结果:
         * A的静态初始化块
            B的静态初始化块
            C的静态初始化块
            第一次创建C的对象----
            A的普通初始化块
            A的无参构造器
            B的普通初始化块
            B的无参构造器
            B的有参构造器,他的参数构造值string=传入B有参构造器的的参数
            C的普通初始化块
            执行C的无参构造器
            第二次创建C的对象----
            A的普通初始化块
            A的无参构造器
            B的普通初始化块
            B的无参构造器
            B的有参构造器,他的参数构造值string=传入B有参构造器的的参数
            C的普通初始化块
            执行C的无参构造器
         */
    }
  • 相关阅读:
    PostgreSQL数据库逻辑复制实践
    CentOS7通过yum安装postgreSQL
    MongoDB动态建表方案(官方原生驱动)
    7大常用开源数据库利弊全对比
    错误:由于系统时间错误证书验证失败导致更新不成功
    deppin更新提示“由于没有公钥,无法验证下列签名”
    Debian 9 Vim无法使用鼠标右键复制 解决方法
    PHP版滑动时间窗口算法
    RabbitMQ PHP 代码示例
    创建或修改 docker 容器内部文件
  • 原文地址:https://www.cnblogs.com/fifiyong/p/6011224.html
Copyright © 2020-2023  润新知