A股上市公司传智教育(股票代码 003032)旗下技术交流社区北京昌平校区

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© ygxheima 中级黑马   /  2016-5-19 22:50  /  469 人查看  /  0 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

/**
         代码块的含义是Java中用{}括起来的内容:以下的分析主要是针对静态代码块和构造代码块的;
*构造代码块是指对象在创建的时候优先于构造方法先执行的,由于在每个子类的构造方法中都有先执行父类的构造方法,也就是说会先执行完父类,在执行子类的;
*静态代码块是在该类加载的时候会执行,只会执行一次;也叫做类的初始化代码;
这两者的原理在于:JVM在执行程序的时候,通过ClassLoad进行类型加载的时候,对类进行初始化的逻辑(包括static域和static代码块)都封装在了一个系统Java.lang.Class的方法clinit方法中,而对象的实例化操作封装在了init的方法中,而这两个方法分别在类加载和对象创建的时候调用,所以static代码块只执行
一次,构成代码块会执行多次;
具体测试代码如下:
*/
class ExtendsDemo2 {
        //在测试类中也有一个静态代码块,构造代码块,以及局部代码块
        static {
                System.out.println("这是测试类的静态代码块");
        }

        {
                System.out.println("这是测试类的构造代码块");
        }
        public static void main(String[] args) {
                {
                        System.out.println("测试类的在对象前的局部代码块");
                }
                //在这个地方创建一个子类对象,用来测试创建对象的执行流程
                Son son = new Son();
                System.out.println("----------------------------------------------");
                Son son2 = new Son("小易");
                {
                        int x = 100;
                        System.out.println("这是测试类的局部代码块" + x);//局部代码块的作用是为了控制局部变量的生命周期,提早释放内存;
                }
        }
}


/*
这段代码是用来测试代码块的执行顺序的,创建三个类,分别为根类,父类,子类,然后用输出语句模拟代码块的执行流程
*/

//根类,有两个构造方法,一个是有参数的,一个是无参数的,因为在子类的构造方法执行的时候,会默认执行父类的无参构造方法

class GrandFather {
        String name;

        //无参构造方法
        public GrandFather() {
                System.out.println("根类----这是根类的-----------------无参构造方法");
        }

        //根类的有参构造方法

        public GrandFather(String name) {
                this.name = name;
                System.out.println("根类---------这是根类的--有参构造方法");
        }

        //根类的静态代码块,用来给根类在加载的时候初始化根类使用的,这个代码块在根类加载到方法区时执行一次.除非根类重新加载到方法区,不然不会再执行
        static {
                System.out.println("这是根类的 -----静态代码块");
        }

        //根类的构造代码块,在根类的任何一个构造方法调用时优先于构造方法执行.用来存储构造方法中相同的代码部分,这样可以提高代码的复用性
        {
                System.out.println("这是根类的------------------构造代码块");
        }
}

class Father extends GrandFather {
        //父类的方法代码跟根类的类似

        public Father() {
                System.out.println("父类;;;这是父类的;;;;;;;;;无参构造方法");
        }

        //根类的有参构造方法

        public Father(String name) {
                this.name = name;
                System.out.println("父类;;;;;;;;;;;;;这是父类的;;有参构造方法");
        }

        //根类的静态代码块,用来给根类在加载的时候初始化根类使用的,这个代码块在根类加载到方法区时执行一次.除非根类重新加载到方法区,不然不会再执行
        static {
                System.out.println("这是父类的;;;;;;;;静态代码块");
        }

        //根类的构造代码块,在根类的任何一个构造方法调用时优先于构造方法执行.用来存储构造方法中相同的代码部分,这样可以提高代码的复用性
        {
                System.out.println("这是父类的;;;;;;;;;;;;;;;;;;构造代码块");
        }
}

class Son extends Father {

        public Son() {
                System.out.println("子类//这是子类的///////////////无参构造方法");
        }

        //根类的有参构造方法

        public Son(String name) {
                this.name = name;
                System.out.println("子类//////////////这是子类的//有参构造方法");
        }

        //根类的静态代码块,用来给根类在加载的时候初始化根类使用的,这个代码块在根类加载到方法区时执行一次.除非根类重新加载到方法区,不然不会再执行
        static {
                System.out.println("这是子类的////////////静态代码块");
        }

        //根类的构造代码块,在根类的任何一个构造方法调用时优先于构造方法执行.用来存储构造方法中相同的代码部分,这样可以提高代码的复用性
        {
                System.out.println("这是子类的///////构造代码块");
        }
}



0 个回复

您需要登录后才可以回帖 登录 | 加入黑马