代码块
介绍:代码块又称为初始化块 ,属于类中的成员(即是类的一部分),类似于方法,将逻辑语句封装 在方法体中,通过{}
包围起来
与类方法的不同点
一、代码块的基本使用
1. 修饰符 可选,要写 的话,只能 写static
3. 代码块的内容 :可以为任何逻辑语句(输入,输出,方法调用,循环,判断等) 应用举例:如果多个构造器中都有重复的语句 ,可以抽取到初始化块中,提高代码的复用性
{ System . out. println ( "我是末尾没有分号的代码块" ) ;
}
{ System . out. println ( "我是末尾带有分号的代码块" ) ;
} ;
二、代码块的使用细节 (重点,难点 )
(1)static 代码块 也叫静态代码块,它随着类的加载而执行 ,并且只会执行一次 。 (3)类在什么时候被加载 (非常重要!!! ) 1. 创建对象实例时(new) 3. 使用类的静态成员
时(静态属性,静态方法) 1.调用静态代码块 和静态属性初始化 (注意:静态代码块
和静态属性
初始化调用的优先级一样 ,如果有多个静态代码块和多个 静态变量初始化,则按他们定义的顺序调用 ) 3. 调用构造方法 。 1. 隐含了super() 注意:类的加载会完成静态属性的初始化和静态代码块的调用,所有构造器在类加载后调用 一、类加载 时,静态相关的内容 父类的静态代码块和静态属性(优先级一样,按定义顺序执行) 二、构造器 的调用过程实现 父类的普通代码块和普通属性初始化(优先级一样,按定义顺序执行) 子类的普通代码块和普通属性初始化(优先级一样,按定义顺序执行) 总结: 1. 首先有继承关系,现有父类,后有子类 (1)类加载---->静态代码块和静态属性的初始化(调用顺序看定义顺序) (3)普通代码块的调用和普通属性的初始化 (6)静态 代码块只能调用静态 成员(静态属性和静态方法
三、代码示例:体会代码块的调用和类加载的过程
package codeblock ; public class main { public static void main ( String [ ] args) { new b ( ) ; }
} class a{ static { System . out. println ( "调用 父类 的 static 代码块" ) ; System . out. println ( ) ; test ( ) ; System . out. println ( "------------------------------------------" ) ; } ; { System . out. println ( "========类加载完毕,静态相关内容初始化结束,进入 构造器 的初始化!!!========\n" ) ; System . out. println ( "------------------------------------------" ) ; System . out. println ( "调用 父类 的 普通 代码块" ) ; System . out. println ( ) ; test ( ) ; test1 ( ) ; System . out. println ( "------------------------------------------" ) ; } ; public a ( ) { System . out. println ( "调用 父类 的构造器" ) ; System . out. println ( "------------------------------------------" ) ; System . out. println ( ) ; System . out. println ( "===========该类的所有初始化工作结束,接着完成子类的初始化工作===========\n" ) ; } public static void test ( ) { System . out. println ( "调用 父类 中的 static类型 的 test()方法" ) ; } public void test1 ( ) { System . out. println ( "调用 父类 中的 static类型 的 test1()方法" ) ; } } class b extends a{ static { System . out. println ( "调用 子类 的 static 代码块" ) ; System . out. println ( ) ; test ( ) ; System . out. println ( "------------------------------------------" ) ; System . out. println ( ) ; } ; { System . out. println ( "------------------------------------------" ) ; System . out. println ( "调用 子类 的 普通 代码块" ) ; System . out. println ( ) ; test ( ) ; test1 ( ) ; System . out. println ( "------------------------------------------" ) ; } ; public b ( ) { System . out. println ( "调用 子类 的构造器" ) ; System . out. println ( "------------------------------------------" ) ; System . out. println ( ) ; System . out. println ( "===========该类的所有初始化工作结束,接着完成子类的初始化工作===========\n" ) ; } public static void test ( ) { System . out. println ( "调用 子类 中的 static类型 的 test()方法" ) ; } public void test1 ( ) { System . out. println ( "调用 子类 中的 static类型 的 test1()方法" ) ; } }
输出结果
调用 父类 的 static 代码块调用 父类 中的 static类型 的 test()方法
------------------------------------------
调用 子类 的 static 代码块调用 子类 中的 static类型 的 test()方法
------------------------------------------========类加载完毕,静态相关内容初始化结束,进入 构造器 的初始化!!!========------------------------------------------
调用 父类 的 普通 代码块调用 父类 中的 static类型 的 test()方法
调用 子类 中的 static类型 的 test1()方法
------------------------------------------
调用 父类 的构造器
------------------------------------------===========该类的所有初始化工作结束,接着完成子类的初始化工作===========------------------------------------------
调用 子类 的 普通 代码块调用 子类 中的 static类型 的 test()方法
调用 子类 中的 static类型 的 test1()方法
------------------------------------------
调用 子类 的构造器
------------------------------------------===========该类的所有初始化工作结束,接着完成子类的初始化工作===========进程已结束,退出代码0