文档章节

几种代码块的执行顺序

Hu_Captain
 Hu_Captain
发布于 2015/09/01 19:53
字数 888
阅读 18
收藏 0

在java中常见的代码快有静态代码块,构造代码块,局部代码块。

1. 几种代码快的特点:

1.1 静态代码块

    静态代码快:作用在类体中。随着类的加载而加载。常把一些需要在类加载后需要的一些数据放在静态代码块中。

1.2 构造代码快

    构造代码快:作用在类体中。他会在构造方法执行前去执行,并且每执行一次构造方法,构造代码块就会被执行一次。

    什么时候用呢?比如说,我们可以将所有构造方法都要执行的内容,向上抽取将其放入到构造代码块中,使每个重载的构造方法都减少代码量,看起来简洁。

1.3 局部代码快

    局部代码快:因为是局部的,很明显是作用在方法内了。格式:{语句;}。主要用来限定执行的范围。


2. 举例说明执行的顺序

    下面我们通过代码来具体看下这几种代码块的执行顺序:

package com.ilaoda.codeblock;

/**
 * 父类
 * @author 
 */
class Father{
	
	// 父类静态代码快
	static{
		System.out.println("111---父类静态代码快");
	}
	
	// 父类构造代码块
	{
		System.out.println("222---父类构造代码块");
	}
	
	// 父类构造方法
	public Father() {
		System.out.println("333---父类构造方法");
	}
	
	public void hello() {
		// 局部代码块
		{
			System.out.println("444---局部代码块");
		}
	}
}

/**
 * 子类
 * @author iLaoda
 */
class Child extends Father {
	
	// 子类构造方法
	public Child() {
		//super(); 子类构造默认调用父类的无参构造,必须位于子类构造方法内第一行
		System.out.println("555---子类构造方法");
	}
	
	// 子类静态代码块
	static{
		System.out.println("666---子类静态代码块");
	}
	
	// 子类构造代码快
	{
		System.out.println("777---子类构造代码快");
	}
	
	public static void main(String[] args) {
		Child child = new Child();
		Father father = new Father();
		father.hello();	
	}
}

    执行结果:

111---父类静态代码快
666---子类静态代码块
222---父类构造代码块
333---父类构造方法
777---子类构造代码快
555---子类构造方法
222---父类构造代码块
333---父类构造方法
444---局部代码块


3. 分析说明

    因为子类继承父类,所以肯定是类加载器先加载父类。这时,父类静态代码块随着父类的加载而加载,当父类加载完毕后,这时类加载器开始加载子类,子类的静态代码快又随之被加载。由由于子类的创建依赖于父类,所以,在子类的main()方法中首先new一个子类时,此时逻辑调往父类中,父类的构造代码块在父类构造方法前被执行,再执行父类的构造方法。当这些执行完毕后,回到子类中,执行子类的构造方法块,子类的构造方法。

    接下来的一条语句再new Father( )时,同样执行父类的构造代码块,父类构造方法。记住,这时静态代码块不再执行。因为,静态代码块随着类的加载已经加载进来执行过了,并且就只执行这一次。最后,父类的引用调用父类中的一个方法,这个方法中有个静态代码快也随之执行。

4. 另外

    如果本文若存在错误,欢迎批评指正,一起交流分享。






© 著作权归作者所有

Hu_Captain
粉丝 4
博文 33
码字总数 21206
作品 0
浦东
程序员
私信 提问
猎头最爱问的java面试题附答案(二)

1.什么是迭代器(Iterator)? Iterator接口提供了很多对集合元素进行迭代的方法。每一个集合类都包含了可以返回迭代器实例的 迭代方法。迭代器可以在迭代的过程中删除底层集合的元素。 2.为什...

嘿你好夏天
2017/12/27
0
0
Swift - 条件语句、循环语句

一、条件语句 条件语句通过设定的一个或多个条件来执行程序,在条件为真时执行指定的语句,在条件为 false 时执行另外指定的语句。 可以通过下图来简单了解条件语句的执行过程: Swift提供了以...

Albert_Li99
2017/11/16
0
0
AngularJS配置.run()块中设置路由事件的监听器以及过滤未经授权的请求

AngularJS中的run方法初始化全局数据,只对全局作用域起作用,如$rootScope.多个控制器之间可以共享数据,如下代码所示: 配置 在模块的加载阶段,AngularJS会在提供者注册和配置的过程中对模...

孟飞阳
2018/07/18
12
0
重学前端学习笔记(二十)--try里面放return,finally还会执行吗?

笔记说明 重学前端是程劭非(winter)【前手机淘宝前端负责人】在极客时间开的一个专栏,每天10分钟,重构你的前端知识体系,笔者主要整理学习过程的一些要点笔记以及感悟,完整的可以加入w...

凯小默
05/19
0
0
并发编程笔记二:synchronized锁住了谁?

在并发编程中要使用到关键字,当我们用关键字修饰一个方法时,代表着一个锁(Lock),那么这个锁的对象是什么,也就是它锁住了谁? 的使用情况大概就是下面几种: synchronized修饰非静态方法...

binxin5108
2016/12/23
331
0

没有更多内容

加载失败,请刷新页面

加载更多

64.监控平台介绍 安装zabbix 忘记admin密码

19.1 Linux监控平台介绍 19.2 zabbix监控介绍 19.3/19.4/19.6 安装zabbix 19.5 忘记Admin密码如何做 19.1 Linux监控平台介绍: 常见开源监控软件 ~1.cacti、nagios、zabbix、smokeping、ope...

oschina130111
今天
10
0
当餐饮遇上大数据,嗯真香!

之前去开了一场会,主题是「餐饮领袖新零售峰会」。认真听完了餐饮前辈和新秀们的分享,觉得获益匪浅,把脑子里的核心纪要整理了一下,今天和大家做一个简单的分享,欢迎感兴趣的小伙伴一起交...

数澜科技
今天
7
0
DNS-over-HTTPS 的下一代是 DNS ON BLOCKCHAIN

本文作者:PETER LAI ,是 Diode 的区块链工程师。在进入软件开发领域之前,他主要是在做工商管理相关工作。Peter Lai 也是一位活跃的开源贡献者。目前,他正在与 Diode 团队一起开发基于区块...

红薯
今天
6
0
CC攻击带来的危害我们该如何防御?

随着网络的发展带给我们很多的便利,但是同时也带给我们一些网站安全问题,网络攻击就是常见的网站安全问题。其中作为站长最常见的就是CC攻击,CC攻击是网络攻击方式的一种,是一种比较常见的...

云漫网络Ruan
今天
11
0
实验分析性专业硕士提纲撰写要点

为什么您需要研究论文的提纲? 首先当您进行研究时,您需要聚集许多信息和想法,研究论文提纲可以较好地组织你的想法, 了解您研究资料的流畅度和程度。确保你写作时不会错过任何重要资料以此...

论文辅导员
今天
8
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部