`

Java编程之构造代码块

    博客分类:
  • Java
阅读更多

       最近工作不忙,闲来无事,就看看书,今天遇到了构造代码块让我一顿好奇。构造函数倒是了解一些,构造代码块还是第一次听说,那么到底什么是构造代码块?

      其实,构造代码块是代码块的一种类型。代码块是指用大括号把多行代码封装在一起,形成一个独立的数据体,实现特定算法的代码集合。一般来说,代码块是不能单独运行,必须要有运行主体。在Java中一共有四种类型的代码块,即:

      1、普通代码块:就是在方法后面使用“{}”括起来的代码片段,它不能单独运行,必须通过方法名调用执行。

      2、静态代码块:在类中使用static修饰,并使用“{}”括起来的代码片段,用于静态变量的初始化或对象创建前的环境初始化。

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

      4、构造代码块:在类中没有任何前缀或后缀,并使用“{}”括起来的代码片段。

 

      从这个命名就可以看出构造代码块和构造函数肯定有一定的关系,那么究竟是什么关系呢?在回答这个问题之前,我们先要知道Java编译器是如何处理构造代码块的,下面通过一个实例来说明:

public class DemoA {
	//构造代码块
	{
		System.out.println("执行构造代码块");
	}
	
	public DemoA(){
		System.out.println("执行无参构造函数");
	}
	
	public DemoA(String str){
		System.out.println("执行有参构造函数,参数:" + str);
	}
	
	public static void main(String args[]){
		new DemoA();
		new DemoA("construct code block");
	}
}

运行这个demo后,在控制台输出的信息如下:

执行构造代码块

执行无参构造函数

执行构造代码块

执行有参构造函数,参数:construct code block

 

       从我用红色标出来的打印信息可以看出,Java编译器在处理构造代码块的时候,是直接把它插在每个构造函数的最前面,执行完构造代码块里面的内容后,再执行构造函数中的内容。

根据这个实例,就可以很好的回答构造代码块与构造函数之间的关系:构造代码块会在每个构造函数内首先执行,这里需要注意的是构造代码块不是在构造函数之前先执行,它是依托构造函数执行的

      DemoA这个实例说明了构造代码块与构造函数之间的关系,那有没有特例呢?还是通过一个实例来证明,这个实例的作用统计一个类的实例数量。

public class CountObjectInstanceNum {
    public static void main(String[] args){
    	new Base();
    	new Base("AAA");
    	new Base(100);
    	System.out.println("The number of object instance is " + Base.getNumOfObjects());
    }
}

class Base{
	//对象计数器
	private static int numOfObjects = 0;
	
	{
		//构造代码块,计算产生的对象数量
		numOfObjects++ ;
	}
	
	public Base(){
		System.out.println("I am a constructor without parameter");
	}
	
	public Base(String str){
		//有参构造函数调用无参构造函数	
		this();
		System.out.println("I am a constructor with having parameter: " + str);
	}
	
	public Base(int m){
		System.out.println("I am a constructor with having parameter: " + m);
	}
	
	public static int getNumOfObjects(){
		return numOfObjects;
	}
}

这个实例运行结构如下:

I am a constructor without parameter

I am a constructor without parameter

I am a constructor with having parameter: AAA

I am a constructor with having parameter: 100

The number of object instance is 3

 

       根据DemoA这个实例得出的结论,CountObjectInstanceNum统计出来的实例应该是4 ,而红色标出的却是3。这就说明了上面所提出的结论是存在特例的情况的,即:如果遇到this关键字(也就是构造函数调用自身其他的构造函数时)则不插入构造代码块。

       如果是super关键字呢,在构造代码块的处理上,super方法没有任何特殊的地方,编译器只会把构造代码块插入到super关键字方法之后执行,有兴趣的朋友可以试试。

分享到:
评论

相关推荐

    java技术学习文档.docx

    Java的代码块包括静态代码块、实例代码块和构造代码块,它们会在程序运行时被执行。Java中的异常处理机制可以帮助开发人员避免程序运行时出现的错误。 Java编程环境 Java编程环境包括Java开发工具(IDE)和Java开发...

    Java开发技术大全(500个源代码).

    代码范例列表 第1章 示例描述:本章演示如何开始使用JDK进行程序的开发。 HelloWorldApp.java 第一个用Java开发的应用程序。 firstApplet.java 第一个用Java开发的Applet小程序。 firstApplet.htm 用来装载...

    JAVA并发编程实践 .pdf

    介绍了如何使用类库提供的基本并发构建块,用于避免并发危险、构造线程安全的类及验证线程安全的规则,如何将小的线程安全类组合成更大的线程安全类,如何利用线程来提高并发应用程序的吞吐量,如何识别可并行执行的任务...

    Java2游戏编程.pdf

    2.1.5 Java中的代码块 2.1.6 Java程序组成部分的关键点回顾 2.2 比特和字节:原始的Java类型 2.2.1 基本的整数类型 2.2.2 浮点类型 2.2.3 Char类型 2.2.4 布尔型 2.2.5 String类型 2.2.6 强制转换变量类型 2.2.7 ...

    java编程基础,应用与实例

    第1章 什么是Java程序设计语言 1 1.1 Java语言诞生背景 1 1.2 Java语言的特点 1 1.2.1 可移植性(universality) 1 1.2.2 安全性(security) 1 1.2.3 Java Virtual Machine(JVM) 2 1.2.4 面向对象的程序...

    万花规JAVA源代码

    感受曲线之美...... 万花规可以为您画出瑰丽多姿的曲线!算法来源于儿时我们常玩的一种玩具,一块薄板中间有个大...用JAVA程序如何编写呢?使电脑可以画出复杂、绚丽而漂亮的曲线,希望给您工作学习之余带来些许创意!

    Java并发编程实战.rar

    介绍了如何使用类库提供的基本并发构建块,用于避免并发危险、构造线程安全的类及验证线程安全的规则,如何将小的线程安全类组合成更大的线程安全类,如何利用线程来提高并发应用程序的吞吐量,如何识别可并行执行的...

    Java并发编程实战(华章专业开发者书库).mobi

    介绍了如何使用类库提供的基本并发构建块,用于避免并发危险、构造线程安全的类及验证线程安全的规则,如何将小的线程安全类组合成更大的线程安全类,如何利用线程来提高并发应用程序的吞吐量,如何识别可并行执行的...

    Java并发编程实践

    介绍了如何使用类库提供的基本并发构建块,用于避免并发危险、构造线程安全的类及验证线程安全的规则,如何将小的线程安全类组合成更大的线程安全类,如何利用线程来提高并发应用程序的吞吐量,如何识别可并行执行的...

    《Java并发编程实战》

    介绍了如何使用类库提供的基本并发构建块,用于避免并发危险、构造线程安全的类及验证线程安全的规则,如何将小的线程安全类组合成更大的线程安全类,如何利用线程来提高并发应用程序的吞吐量,如何识别可并行执行的任务...

    java开发编程实战 最新版【高清完整版PDF,豆瓣9分神书】

    介绍了如何使用类库提供的基本并发构建块,用于避免并发危险、构造线程安全的类及验证线程安全的规则,如何将小的线程安全类组合成更大的线程安全类,如何利用线程来提高并发应用程序的吞吐量,如何识别可并行执行的...

    JAVA并发编程实践 带书签

    介绍了如何使用类库提供的基本并发构建块,用于避免并发危险、构造线程安全的类及验证线程安全的规则,如何将小的线程安全类组合成更大的线程安全类,如何利用线程来提高并发应用程序的吞吐量,如何识别可并行执行的...

    java 静态非静态 字段方法 子类父类构造_初始化顺序!

    java 静态_非静态 字段_方法_代码块 子类父类构造_初始化顺序! 三个class 让你清清楚楚 第一个class java代码如下: package initialOrder; class Parent { // 静态变量 public static String p_StaticField...

    java并发编程实战相关书籍

    介绍了如何使用类库提供的基本并发构建块,用于避免并发危险、构造线程安全的类及验证线程安全的规则,如何将小的线程安全类组合成更大的线程安全类,如何利用线程来提高并发应用程序的吞吐量,如何识别可并行执行的...

    Java并发编程实战.pdf

    介绍了如何使用类库提供的基本并发构建块,用于避免并发危险、构造线程安全的类及验证线程安全的规则,如何将小的线程安全类组合成更大的线程安全类,如何利用线程来提高并发应用程序的吞吐量,如何识别可并行执行的...

    Java并发编程实战

    介绍了如何使用类库提供的基本并发构建块,用于避免并发危险、构造线程安全的类及验证线程安全的规则,如何将小的线程安全类组合成更大的线程安全类,如何利用线程来提高并发应用程序的吞吐量,如何识别可并行执行的...

    Java并发编程实战-高清完整版-带书签

    介绍了如何使用类库提供的基本并发构建块,用于避免并发危险、构造线程安全的类及验证线程安全的规则,如何将小的线程安全类组合成更大的线程安全类,如何利用线程来提高并发应用程序的吞吐量,如何识别可并行执行的...

    Java 并发编程实战(中文+高清版).zip

    介绍了如何使用类库提供的基本并发构建块,用于避免并发危险、构造线程安全的类及验证线程安全的规则,如何将小的线程安全类组合成更大的线程安全类,如何利用线程来提高并发应用程序的吞吐量,如何识别可并行执行的...

Global site tag (gtag.js) - Google Analytics