[JAVA]静态代码块及执行顺序
2013-11-17 02:26
232 查看
据说这个知识点实际开发并不多见,主要做掌握使用。
但因为练习的时候顺带复习了构造函数,所以还是一并写写。
知识点:静态代码块以及类被加载之后内部的执行顺序。
先吐槽一下,我有个不知道算不算毛病的毛病,就是虽然现在这些代码只是练习,但依然不喜欢在里面用注释写太多笔记。
虽然老师讲课的时候会这么做,但我却更倾向于把它们整理到博客里。
先来看代码:
试题为:
请给出这段代码执行之后,屏幕上的打印内容。
分析如下:
new StaticCode(7);// one three four
主函数里新建了一个匿名对象,并往里传入了参数7
这个对象通过StaticCode进行了加载。
而静态代码块会随着类的加载而加载,所以第一条执行的语句会是:
屏幕上第一个打印的会是“one”。
随后,类在堆内存中开辟了空间,之后会加载构造代码块。所以第二条执行语句会是:
再之后,会启动用类名直接调用的,带了一个整数类型参数的构造函数,即第三条执行语句为:
最后再打印主函数内的执行语句,打印出 The End
所以屏幕上将显示:
one
three7
four
The End
静态代码块的特点:
1)随着类的加载而加载;
2)只执行一次,类加载完毕后,当类存在于内存中之后,重复使用该类都不会再次进行加载。所以静态代码块只执行一次;
3)作用:用于给类进行初始化,当类中没有建立对象之前,如果有需要该类做的事情,可以使用静态代码块来进行初始化;
4)优先于主函数运行;
5)不需要对象也可以直接运行;
6)静态代码块只能访问静态成员*;
*:以上代码中,如果将
这里的num写在静态代码块当中,编译时会提示无法访问非静态成员。
因为,num被定义在类当中,没有设置静态属性,所以如果没有建立对象的话,num是不会建立的。
但如果将num定义在构造代码块当中,由于构造代码块用于给所有对象统一初始化,所以这时可以编译通过。
因为构造代码块会优先于构造函数运行。
当一个类加载之后的执行顺序:
1)静态代码块;
2)构造代码块;
3)构造函数;
但因为练习的时候顺带复习了构造函数,所以还是一并写写。
知识点:静态代码块以及类被加载之后内部的执行顺序。
先吐槽一下,我有个不知道算不算毛病的毛病,就是虽然现在这些代码只是练习,但依然不喜欢在里面用注释写太多笔记。
虽然老师讲课的时候会这么做,但我却更倾向于把它们整理到博客里。
先来看代码:
class StaticCode { int num= 9; StaticCode() { System.out.println("two"); } { System.out.println("three"+num); } static { System.out.println("one"); } StaticCode(int y) { System.out.println("four"); } } class StaticCodeDemo { public static void main(String[] args) { new StaticCode(7);// one three four System.out.println("The End"); } }
试题为:
请给出这段代码执行之后,屏幕上的打印内容。
分析如下:
new StaticCode(7);// one three four
主函数里新建了一个匿名对象,并往里传入了参数7
这个对象通过StaticCode进行了加载。
而静态代码块会随着类的加载而加载,所以第一条执行的语句会是:
static { System.out.println("one"); }
屏幕上第一个打印的会是“one”。
随后,类在堆内存中开辟了空间,之后会加载构造代码块。所以第二条执行语句会是:
{ System.out.println("three"+num); }
再之后,会启动用类名直接调用的,带了一个整数类型参数的构造函数,即第三条执行语句为:
StaticCode(int y) { System.out.println("four"); }
最后再打印主函数内的执行语句,打印出 The End
所以屏幕上将显示:
one
three7
four
The End
静态代码块的特点:
1)随着类的加载而加载;
2)只执行一次,类加载完毕后,当类存在于内存中之后,重复使用该类都不会再次进行加载。所以静态代码块只执行一次;
3)作用:用于给类进行初始化,当类中没有建立对象之前,如果有需要该类做的事情,可以使用静态代码块来进行初始化;
4)优先于主函数运行;
5)不需要对象也可以直接运行;
6)静态代码块只能访问静态成员*;
*:以上代码中,如果将
{ System.out.println("three"+num); }
这里的num写在静态代码块当中,编译时会提示无法访问非静态成员。
因为,num被定义在类当中,没有设置静态属性,所以如果没有建立对象的话,num是不会建立的。
但如果将num定义在构造代码块当中,由于构造代码块用于给所有对象统一初始化,所以这时可以编译通过。
因为构造代码块会优先于构造函数运行。
当一个类加载之后的执行顺序:
1)静态代码块;
2)构造代码块;
3)构造函数;
相关文章推荐
- Java 中文字符判断 中文标点符号判断
- Configure Eclipse for Hadoop 1.0.4 in Ubuntu
- Eclipse的使用
- Java - 数据库连接池实现
- java文件,图片的复制
- 深入研究java.lang.ThreadLocal类
- Java基础 之软引用、弱引用、虚引用
- MyEclipse安装Freemarker插件
- java代码swing编程 制作一个单选按钮的Frame
- 【JAVA安装】环境变量配置
- 02--java语法基础
- java概述
- 刚学java做的记事本
- JAVA动态代理
- netbeans build in one jar
- MyEclipse设置全局编码
- 常用Eclipse插件
- Java内存泄露的理解与解决
- Java中堆内存和栈内存详解
- Java的clone方法--深拷贝和浅拷贝