Java静态代码块的问题

标签: java 代码 问题 | 发表时间:2015-08-08 13:40 | 作者:
出处:http://www.iteye.com

在查看别人代码的时候 看到了 static静态代码块  之后经过搜索和自己的亲试,下面贴出测试代码和解释。

package Test;
public class TestA {
	static {
		System.out.println("父类--静态代码块");
	}

	public TestA() {
		System.out.println("父类--构造方法");
	}

	{
		System.out.println("父类--非静态代码块");
	}

	public static void main(String[] args) {
		new TestB();
	}
}

class TestB extends TestA {
	static {
		System.out.println("子类--静态代码块");
	}
	{
		System.out.println("子类--非静态代码块");
	}

	public Test() {
		System.out.println("子类--构造方法");
	}
}

 跑起来的结果是:

父类--静态代码块

子类--静态代码块

父类--非静态代码块

父类--构造方法

子类--非静态代码块

子类--构造方法

 

在这个代码中,代码的执行顺序,就是 在主类中首先执行static静态代码块中的代码,同理,之后在主函数中 建立了TestB对象,在执行构造函数之前,首先查看TestB中是否有static静态块,之后首先执行了静态代码块中的代码。当TestB的静态代码块执行完毕之后,它接着又去看A有没有非静态代码块,如果有就执行A类的非静态代码块,A的非静态代码块执行完毕,接着执行A的构造方法;A的构造方法执行完毕之后,它接着去看B有没有非静态代码块,如果有就执行B的非静态代码块。B类的非静态代码块执行完毕再去执行B类的构造方法,这个就是一个对象的初始化顺序。
噫,,写出来了好像挺麻烦的。。大致就是 1静态代码块  -->2非静态代码块  -->3构造方法

 

然后进行了有一个测试:

这个测试是测试是否一定是静态块先执行。

package Test;

public class TestA2 {
	private static TestA2 a = new TestA2();
	static {
		System.out.println("父类--静态代码块");
	}

	public TestA2() {
		System.out.println("父类--构造方法");
	}

	{
		System.out.println("父类--非静态代码块");
	}

	public static void main(String[] args) {
		new TestB2();
	}
}
class TestB2 extends TestA2 {
	private static TestB2 b = new TestB2();
	static {
		System.out.println("子类--静态代码块");
	}
	{
		System.out.println("子类--非静态代码块");
	}

	public TestB2() {
		System.out.println("子类--构造方法");
	}
}

 

结果如下:

父类--非静态代码块

父类--构造方法

父类--静态代码块

父类--非静态代码块

父类--构造方法

子类--非静态代码块

子类--构造方法

子类--静态代码块

父类--非静态代码块

父类--构造方法

子类--非静态代码块

子类--构造方法

这里先new了一个 静态的对象

	private static TestA2 a = new TestA2();

而 在静态代码块和创建静态对象时,是按照 代码的顺序执行的,就是说 需要执行完 这个创建对象的语句才能执行下面的 静态代码块中的语句。所以给人的感觉像是“跳过了”静态代码块,所以一开始是:1非静态代码块2构造方法。之后执行完了 创建对象的语句,继续执行,即静态代码块。之后就是在主类中创建一个TestB2对象,像上面的测试一样,不同的也只是在执行创建对象语句静态代码块和顺序的问题。而执行了两次非静态代码和构造方法的原因就是,一次是创建静态对象时,一次是执行完静态方法后的执行。

 

总结:
对象的初始化顺序:首先执行父类静态的内容,父类静态的内容执行完毕后,接着去执行子类的静态的内容,当子类的静态内容执行完毕之后,再去看父类有没有非静态代码块,如果有就执行父类的非静态代码块,父类的非静态代码块执行完毕,接着执行父类的构造方法;父类的构造方法执行完毕之后,它接着去看子类有没有非静态代码块,如果有就执行子类的非静态代码块。子类的非静态代码块执行完毕再去执行子类的构造方法。总之一句话,静态代码块内容先执行,接着执行父类非静态代码块和构造方法,然后执行子类非静态代码块和构造方法。

 



已有 0 人发表留言,猛击->> 这里<<-参与讨论


ITeye推荐



相关 [java 代码 问题] 推荐:

Java静态代码块的问题

- - ITeye博客
在查看别人代码的时候 看到了 static静态代码块  之后经过搜索和自己的亲试,下面贴出测试代码和解释. System.out.println("父类--静态代码块");. System.out.println("父类--构造方法");. System.out.println("父类--非静态代码块");.

Java代码优化

- - ImportNew
2016年3月修改,结合自己的工作和平时学习的体验重新谈一下为什么要进行代码优化. 在修改之前,我的说法是这样的:. 就像鲸鱼吃虾米一样,也许吃一个两个虾米对于鲸鱼来说作用不大,但是吃的虾米多了,鲸鱼自然饱了. 代码优化一样,也许一个两个的优化,对于提升代码的运行效率意义不大,但是只要处处都能注意代码优化,总体来说对于提升代码的运行效率就很有用了.

java代码开发规范

- - BlogJava_首页
格式规范:                                                                      .       1、TAB空格的数量. 编辑器上的TAB空格数量统一取值为4.       2、换行, 每行120字符.       3、if语句的嵌套层数3层以内   .

Java 代码性能优化

- - IT瘾-geek
代码 优化,一个很重要的课题. 可能有些人觉得没用,一些细小的地方有什么好修改的,改与不改对于代码的运行效率有什么影响呢. 这个问题我是这么考虑的,就像大海里面的鲸鱼一样,它吃一条小虾米有用吗. 没用,但是,吃的小虾米一多之后,鲸鱼就被喂饱了. 代码优化也是一样,如果项目着眼于尽快无BUG上线,那么此时可以抓大放小,代码的细节可以不精打细磨;但是如果有足够的时间开发、维护代码,这时候就必须考虑每个可以优化的细节了,一个一个细小的优化点累积起来,对于代码的运行效率绝对是有提升的.

Java写xml文件的编码问题

- - CSDN博客推荐文章
最近项目中需要生成xml格式的配置文件,用的是 javax.xml.transform.Transformer 类中提供的transform方法,在本地执行没问题,但是一旦把工程部署到Tomcat下运行,就会出现中文乱码的现象,纠结了许久,在大神的帮助下终于解决了. 有篇文章其实已经讲的很清楚了,链接如下:.

Java String 的十大常见问题

- - ITeye博客
Java字符串经常被问到的排名前十的问题.    1、如何比较字符串. 使用 “==”  还是 “equals()”.   简单来讲,“==”比较的是引用(对象的内存地址),“equals()” 比较值是否相等. 除非你想检测两个字符串是否是同一对象,否则都用equals().   当然了解字符串池的概念更好.

java socket 长连接read阻塞问题

- - PHP & Java
1 约定发送的数据长度,比如 http的 keepAlive 就是必须依赖这个的 Content-Length. 2 设置超时的时间,根据我的经验,只有在Socket级别设置才有效. socket.setSoTimeout(100); // 如果超过100毫秒还没有数据,则抛出 SocketTimeoutException.

15个易遗忘的Java问题

- - ITeye博客
1.Java中的基本数据类型以及所占内存大小. short    2字节. float    4字节. double    8字节. char    2字节(Unicode-16).     布尔类型boolean比较特殊,尽管Java虚拟机定义了boolean类型,但虚拟机对boolean类型的支持是有限的,没有为boolean值单独设计JVM指令.

Java最小堆解决TopK问题

- - ITeye博客
其实我们与大数据并不遥远,比如要从海量数据中按大小或频率挑出top k,假定机器是多核的内存有限的,我们采用多线程分块处理数据,最后合并处理. 那么,处理每一块数据的top k(i)可以采用哪些算法呢. TopK问题是指从大量数据(源数据)中获取最大(或最小)的K个数据. TopK问题是个很常见的问题:例如学校要从全校学生中找到成绩最高的500名学生,再例如某搜索引擎要统计每天的100条搜索次数最多的关键词.

printf-小代码,大问题

- mandelbrot89 - IT技术博客大学习
各位C、C++开发的朋友们,有没有想过小小的printf也会有陷阱呢. 这篇文章,我们就深入来探究一下(代码均在suse10 32位系统下编译测试通过). 但是你会不会以为是 a 首先被自动转化成了 int 类型,然后输入为 1的呢. 如果真这么简单,本文到此也该结束了. 如果你还是觉得不可相信,我们再来看一个代码:.