代码块:就是用{}括起来到部分。根据应用的不同分为4类:普通代码块、构造块、静态代码块、同步代码块。
1.普通代码块:定义在方法中的代码块。
如:
- public class Ex22 {
- public static void main(String[] args){
- // 普通代码块
- {
- int i = 3;
- System.out.println("局部变量为 " + i);
- }
- int i = 5;
- System.out.println("相对上面的 i 来说是全局的变量 " + i);
- }
- }
- //局部变量为 3
- //相对上面的 i 来说是全局的变量 5
2.构造块:直接在类中编写的代码块。
- class Demo5{
- {
- System.out.println("构造块");
- }
- public Demo5(){
- System.out.println("构造方法");
- }
- {
- System.out.println("构造方法后的构造块");
- }
- }
- public class Ex22 {
- public static void main(String[] args){
- new Demo5();
- new Demo5();
- }
- }
- //构造块
- //构造方法后的构造块
- //构造方法
- //构造块
- //构造方法后的构造块
- //构造方法
对象被实例化一次构造块就执行一次;
构造块优先执行比构造方法.
3.静态代码块:static 关键字声明的代码块.
- class Demo5{
- {
- System.out.println("1构造块");
- }
- public Demo5(){
- System.out.println("2构造方法");
- }
- {
- System.out.println("3构造方法后的构造块");
- }
- static {
- System.out.println("4静态代码块");
- }
- }
- public class Ex22 {
- static {
- System.out.println("在主方法类中定义的代码块");
- }
- public static void main(String[] args){
- new Demo5();
- new Demo5();
- }
- }
- //在主方法类中定义的代码块
- //4静态代码块
- //1构造块
- //3构造方法后的构造块
- //2构造方法
- //1构造块
- //3构造方法后的构造块
- //2构造方法
- 本文来自CSDN博客,转载请标明出处:http://blog.csdn.net/njiang/archive/2009/10/27/4735707.aspx
主方法静态代码块优先于主方法,
在普通类中静态块优先于构造块,
在普通类中构造块优先于构造方法,
静态块只实例化一次。
无继承情况下的Java初始化顺序:
is null");
main(String str[])
-----静态成员初始化
-----静态块被执行
-----普通成员初始化
-----构造函数执行
块 1 执行");
块 2 执行");
块 1 执行
块 2 执行
--------静态成员
--------普通成员
--------构造函数
块 1 执行");
静态成员staticSam1初始化");
sam1成员初始化");
静态成员staticSam2初始化");
static 块 2 执行");
Test默认构造函数被调用");
sam2成员初始化");
静态成员staticSamSub初始化");
TestSub 默认构造函数被调用");
sam1成员初始化");
静态成员staticSamSub1初始化");
static 块 执行");}
sam2成员初始化");
static 块 1 执行
静态成员staticSam1初始化
静态成员staticSam2初始化
static 块 2 执行
--------父类静态成员初始化
静态成员staticSamSub初始化
静态成员staticSamSub1初始化
static 块 执行
-------子类静态成员初始化
sam1成员初始化
sam2成员初始化
Test默认构造函数被调用
-------父类普通成员初始化和构造函数执行
sam1成员初始化
sam2成员初始化
TestSub 默认构造函数被调用
-------父类普通成员初始化和构造函数执行
- package dian;
- public class Test {
- public static int k=0;
- public static Test t1=new Test("t1");
- public static Test t2=new Test("t2");
- public static int i=print("i");
- public static int n=99;
- public int j=print("j");
- {
- print("构造块");
- }
- static{
- print("静态块");
- }
- public Test(String s){
- System.out.println((++k)+":"+s+" i="+i+" n="+n);
- ++i;++n;
- }
- public static int print(String s){
- System.out.println((++k)+":"+s+" i="+i+" n="+n);
- ++n;
- return ++i;
- }
- /*
- * 类加载之后,按从上到下执行被static修饰的语句,
- * 如果有语句new了自身的对象,将从上到下执行构造代码块,
- * 构造器,创建完对象后,接着执行下面的static语句
- * */
- public static void main(String[] args){
- System.out.println("----main start-------");
- Test t=new Test("init");
- System.out.println("------main end-------");
- }
- }
1. 类记载之后,先从上到下执行static修饰的语句
2.如果static语句中new了自身的对象,将按照如下顺序执行:
(a) 初始化成员变量,没有设置初始值的为默认值 ;(此时后面类静态变量可能没有初始化完成,未执行到的静态变量也是取默认值)
(b)执行构造块
(c)执行构造函数
3.继续执行余下static语句
若存在继承关系,则先加载父类从上到下执行父类static修饰语句,然后再执行子类static语句。初始化类的时候,先初始化父类成员变量、构造块、构造函数;再执行子类成员变量、构造块、构造函数。
Output:
1:j i=0 n=0
2:构造块 i=1 n=1
3:t1 i=2 n=2
4:j i=3 n=3
5:构造块 i=4 n=4
6:t2 i=5 n=5
7:i i=6 n=6
8:静态块 i=7 n=99
----main start-------
9:j i=8 n=100
10:构造块 i=9 n=101
11:init i=10 n=102
------main end-------
关于static
1.static声明与初始化是两个不同操作
2.static声明在编译阶段已经确定了内存的位置
3.static修饰语句,会被编译器拼接成一个static块,并按照顺序从上到下执行