zoukankan      html  css  js  c++  java
  • 菜鸟笔记 -- Chapter 6.2.5 代码块

    6.2.5  代码块

      在编程过程中我们通常会遇到如下这种形式的程序:

    package democlass;
    
    public class CodeBlock {
        
        {
            System.out.println("构造代码块1!");
        }
       static{
            System.out.println("直接由static关键字进行声明的代码块就是静态代码块!");
        }
        //定义构造函数
        public CodeBlock(){
            System.out.println("只要一有实例产生,构造代码块就运行,构造代码块优先于构造函数!");
        }
        static{
            System.out.println("静态代码块优先于构造函数执行,且不管实例化多少次对象,只执行一次!");
        }
        {
            System.out.println("构造代码块2!");
        }
        public static void main(String[] args) {
            {
                int a = 6;//a属于局部变量
                System.out.println("普通代码块:"+a);
            }
            //System.out.println("普通代码块中的变量为局部变量,出了{}生命周期结束"+a);
            int a = 7;
            System.out.println("代码块之外再次声明一个与代码块中变量名称相同的变量不冲突,因为代码块决定了生命周期,如同成员变量和局部变量"+a);
            
            new CodeBlock();
            new CodeBlock();
        }
    }

    如上阴影部分的程序段我们称之为代码块,所谓代码块就是用{}将多行代码封装起来,形成一个独立的数据体,用于实现特定的算法。一般来说代码块是不能单独运行的,他必须要有运行主体,在Java中代码块有四种形式;普通代码块、构造代码块、静态代码块、同步代码块。代码块没有名称,设置代码块的目的是为了初始化类,下面我们来一一分析一下;

    6.2.5.1  普通代码块

    直接定义在方法中的代码块我们称之为普通代码块;

        public static void main(String[] args) {
            {
                int a = 6;//a属于局部变量
                System.out.println("普通代码块:"+a);
            }
            //System.out.println("普通代码块中的变量为局部变量,出了{}生命周期结束"+a);
        }

    普通代码块运行顺序,按照正常的代码顺序,从上至下依次运行,在这里我们要注意一个问题,如果我们声明了一个局部变量,然后在声明的局部变量后面创建代码块,则代码块中局部变量名不能和上面局部变量名相同;这是因为方法中局部变量生命周期没有消失,再次声明会出现变量名相同的情况,和先声明代码块,再声明局部变量不同;

    6.2.5.2  构造代码块

      将代码块直接定义在类中,则称之为构造代码块。构造代码块优先于构造方法执行,且执行多次,只要一有实例化对象产生,就执行构造代码块中内容;

    package democlass;
    
    public class CodeBlock {
        
        {
            System.out.println("构造代码块1!");
        }    
        //定义构造函数
        public CodeBlock(){
            System.out.println("只要一有实例产生,构造代码块就运行,构造代码块优先于构造函数!");
        }
        {
            System.out.println("构造代码块2!");
        }
        public static void main(String[] args) {
             System.out.println("主函数!");
            new CodeBlock();
            new CodeBlock();
        }
    }

    6.2.5.3  静态代码块

      直接使用static关键字进行声明的就是静态代码块。静态块在类加载的时候执行,所以它优先于构造函数,优先于main函数,不管不多少个实例化对象产生,静态代码块只执行一次,静态代码块的主要功能就是为静态发生初始化。在执行类时,希望先执行类的初始化动作,可以使用static定义一个静态代码块。

    package democlass;
    public class CodeBlock {
        {
            System.out.println("构造代码块1!");
        }
        static{
            System.out.println("直接由static关键字进行声明的代码块就是静态代码块!");
        }
        //定义构造函数
        public CodeBlock(){
            System.out.println("只要一有实例产生,构造代码块就运行,构造代码块优先于构造函数!");
        }
        static{
            System.out.println("静态代码块优先于构造函数执行,且不管实例化多少次对象,只执行一次!");
        }
        {
            System.out.println("构造代码块2!");
        }
        public static void main(String[] args) {
            System.out.println("主函数!");
            new CodeBlock();
            new CodeBlock();
        }
    }

    静态代码块主要用于类的初始化。它只执行一次,并在构造函数之前执行。静态代码块的特点主要有:

    • 静态代码块会在类被加载时自动执行。
    • 静态代码块只能定义在类里面,不能定义在方法里面。
    • 静态代码块里的变量都是局部变量,只在块内有效。
    • 一个类中可以定义多个静态代码块,按顺序执行。
    • 静态代码块只能访问类的静态成员,而不允许访问实例成员。

    6.2.5.4  同步代码块

       使用 synchronized 关键字修饰,并使用“{}”括起来的代码片段,它表示同一时间只能有一个线程进入到该方法块中,是一种多线程保护机制。

       从上面我们可以看到普通代码块的作用是限定变量的生命周期,尽早释放,节约内存,当调用其所在的方法时执行;构造代码块的作用是把多个构造方法共同的部分提取出来,共用构造代码块,每次调用构造方法时,都会优先于构造方法执行,也就是每次new一个对象时自动调用,对对象进行初始化;静态代码块的作用是对类进行一些初始化  只加载一次,所有对象共享一份,类加载的时候加载执行,只执行一次;同步代码块的作用是达到线程安全的目的,线程调用该方法时调用;我们从上面可以看出代码块的执行顺序,类加载,静态代码块>构造代码块>构造函数。我们可以通过上面的代码进行验证。

  • 相关阅读:
    PKUSC 2018 题解
    [bzoj 1758] 重建计划
    bzoj 5329 [SDOI2018] 战略游戏
    bzoj 5285 [HNOI2018] 寻宝游戏
    Django 之认证模块
    Django之form表单
    Django 之AJAX
    Django 之中间组件
    Django之 Cookie,Session
    Django之F和Q查询等其他查询
  • 原文地址:https://www.cnblogs.com/lin-jing/p/8056646.html
Copyright © 2011-2022 走看看