zoukankan      html  css  js  c++  java
  • Java的静态块与实例块(转)

    1.当一个类被第一次使用时,它需要被类加载器加载,而加载过程涉及以下两点:

     (1)在加载一个类时,如果它的父类还未被加载,那么其父类必须先被加载;

     (2)当类加载到内存之后,按照在代码中的出现顺序执行它的静态数据域和静态块。

    2.调用一个类的构造函数时,调用过程涉及以下三点:

     (1)调用父类的构造函数;

     (2)按照在代码中出现顺序初始化实例数据域和实行实例块;

     (3)执行其构造函数体。

    public class InitializationDemo {
     
        public static void main(String[] args) {
             
            new InitializationDemo();
        }
         
        public InitializationDemo() {
             
            new B();
        }
         
        {
            System.out.println("2. Initialization 的实例块。");
        }
         
        static {
            System.out.println("1. Initialization 的静态块。");
        }
     
    }
     
     
    class A {
         
        A() {
            System.out.println("6. A 的构造函数体。");
        }
         
        {
            System.out.println("5. A 的实例块。");
        }
         
        static {
            System.out.println("3. A 的静态块。");
        }
    }
     
     
    class B extends A {
         
        B() {
            System.out.println("8. B 的构造函数体。");
        }
         
        {
            System.out.println("7. B 的实例块。");
        }
         
        static {
            System.out.println("4. B 的静态块。");
        }
    }
    

      

    上面的例子在类中各个部分输出对应的文字,以便从输出中看出其执行顺序。

    对应的输出如下:

    1. Initialization 的静态块。

    2. Initialization 的实例块。

    3. A 的静态块。

    4. B 的静态块。

    5. A 的实例块。

    6. A 的构造函数体。

    7. B 的实例块。

    8. B 的构造函数体。

    由输出可以看出程序执行的顺序如下:

    1.首先,要使用Initialization类,则加载Initialization类,所以它的静态块被执行,于是输出1;

    2.程序调用Initialization的构造函数,所以Initialization类的实例块被执行,于是输出2;

    3.然后,执行Initialization的构造函数体,即new B(),这时因为要使用类B,所以将其加载;

    4.因为类B的父类为A,那么在加载B之前,要先加载A,所以这时候执行A的加载过程,即执行A的静态块,于是输出3;

    5.A加载完之后,这时候就到B加载了,这时执行B的加载过程,即执行B的静态块,于是输出4;

    6.加载完成后,这时候按照代码,执行new B(),即B的构造函数,所以这时又要先调用父类A的构造函数,于是这时依次执行A的实例块和构造函数体,输出5和6;

    7.最后,终于到“真正”执行B的构造函数了(因为之前已经一直在说执行new B(),却是一直在调用其他),于是依次执行B的实例块和构造函数体,输出7和8。

  • 相关阅读:
    [Xcode 实际操作]九、实用进阶-(2)遍历设备(输出系统)上的所有字体
    [Xcode 实际操作]九、实用进阶-(1)隐藏顶部的状态栏
    [Xcode 实际操作]八、网络与多线程-(25)实现ShareSdk的社会化分享功能
    [Xcode 实际操作]八、网络与多线程-(24)社会化分享功能开发包的安装和配置:微信、QQ、微博
    [Xcode 实际操作]八、网络与多线程-(23)多线程的同步与异步的区别
    Moving Tables-贪心
    HTTP状态码
    CSS3中transform,transition和animation的简单介绍和使用方法演示样例
    用NODEJS处理EXCEL文件导入导出,文件上传
    内存区域划分
  • 原文地址:https://www.cnblogs.com/a842297171/p/5080559.html
Copyright © 2011-2022 走看看