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();
}
}

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

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

6.2.5.4  同步代码块

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

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

菜鸟笔记 -- Chapter 6.2.5 代码块的更多相关文章

  1. 菜鸟笔记 -- Chapter 6.2 类的构成

    在前面我们讲过高级开发语言大多由7种语法构成,但这是一个很空泛的概述,下,面我们仅就针对Java程序来说一下构成一个Java程序的几大部分,其中类是最小的基本元素.类是封装对象属性和行为的载体,而在J ...

  2. 菜鸟笔记 -- Chapter 6 面向对象

    在Java语言中经常被提到的两个词汇是类与对象,实质上可以将类看作是对象的载体,它定义了对象所具有的功能.学习Java语言必须要掌握类与对象,这样可以从深层次去理解Java这种面向对象语言的开发理念, ...

  3. 菜鸟笔记 -- Chapter 6.4 面向对象的三大特性

    6.4.1  三大特性概述 面向对象的三大特性是Java中一个很重要的基本理念. 封装是面向对象的核心思想.将对象的属性和行为封装起来,其载体就是类,类通常对客户隐藏其实现细节,这就是封装的意思.采用 ...

  4. 菜鸟笔记 -- Chapter 4 Java语言基础

    在Chapter3中我们写了第一个Java程序Hello World,并且对此程序进行了分析和常见错误解析.那么我们有没有认真观察一下Java程序的基本结构呢?本节我就来聊一下Java程序的基本结构( ...

  5. Android(java)学习笔记188:关于构造代码块,构造函数的一道面试题(华为面试题)

    1.源码是: package text; public class TestStaticCon { public static int a = 0; static { a = 10; System.o ...

  6. 菜鸟笔记 -- Chapter 6.4.2 详解继承

    6.4.2  详解继承 6.4.2.1  继承入门 继承使得程序架构具有一定的弹性,在程序中复用一些已经定义完善的类不仅可以减少软件开发周期,也可以提高软件的可维护性和可扩展性.基本思想是基于某个父类 ...

  7. 菜鸟笔记 -- Chapter 6.2.4 成员方法

    6.2.4  成员方法 在Java中使用成员方法对应于类对象的行为,在有些地方也会将方法称之为函数,成员方法是定义在类中具有特定功能的一段独立小程序.方法格式如下: 修饰符 返回值类型 成员方法名 ( ...

  8. 菜鸟笔记 -- Chapter 6.2.1 权限修饰符

    6.2.1  权限修饰符 面向对象的三大特性就有封装,封装隐藏了对象的属性和实现细节,仅对外提供公共访问方式,而这个访问方式就是由权限修饰符控制的.Java中的权限修饰符主要包括private.pub ...

  9. 菜鸟笔记 -- Chapter 6.2.6 内部类

    6.2.6  内部类 在权限修饰符中,我们已经见过内部类了,但我们看到的只是冰山一角,这节我们详细介绍一下内部类,内部类可以分为成员内部类,局部内部类,匿名内部类,静态内部类.下面我们来讲解一下,在讲 ...

随机推荐

  1. bzoj 5303: [Haoi2018]反色游戏

    Description Solution 对于一个有偶数个黑点的连通块,只需要任意两两配对,并把配对点上的任一条路径取反,就可以变成全白了 如果存在奇数个黑点的连通块显然无解,判掉就可以了 如果有解, ...

  2. 深入理解JavaScript系列(15):函数(Functions)

    介绍 本章节我们要着重介绍的是一个非常常见的ECMAScript对象——函数(function),我们将详细讲解一下各种类型的函数是如何影响上下文的变量对象以及每个函数的作用域链都包含什么,以及回答诸 ...

  3. [转]C# - JSON详解

    本文转自:http://www.cnblogs.com/QLJ1314/p/3862583.html 最近在做微信开发时用到了一些json的问题,就是把微信返回回来的一些json数据做一些处理,但是之 ...

  4. mvc 页面简单get获取后台数据

    后台方法 public ActionResult Linq() { var lt = UserSys.FindAll(); Hashtable ht = new Hashtable(); ht.Add ...

  5. web.config节点

    1.clientCache 源码: <system.webServer> <staticContent> <clientCache cacheControlMode=&q ...

  6. Mysql只Union用法

    MYSQL中的UNION UNION在进行表链接后会筛选掉重复的记录,所以在表链接后会对所产生的结果集进行排序运算,删除重复的记录再返回结果. 举例说明: select * from table1 u ...

  7. common-jdbc:一个基于SpringJdbcTemplate的高性能数据库操作工具类库

    项目地址:https://gitee.com/cnsugar/common-jdbc 一.简介 基于SpringJdbcTemplate的高性能数据库操作工具类库,支持mysql.oracle数据库, ...

  8. linkedHashMap源码解析(JDK1.8)

    引言 关于java中的不常见模块,让我一下子想我也想不出来,所以我希望以后每次遇到的时候我就加一篇.上次有人建议我写全所有常用的Map,所以我研究了一晚上LinkedHashMap,把自己感悟到的解释 ...

  9. jquery hover(overListener, outListener) || bind('mouseover',methodA).bind('mouseout',methodB)

    1.区别: bind方式,进入外部区域和内部区域都会触发相关方法(methodA 或methodB): hover方式,进入内部区域不会再触发相关方法. 2.example: <body> ...

  10. Elipse plugin or Bundle & OSGI

    Develop and register service, lookup and use service! Android Design on service's publish-find-bind ...