1、静态代码块
- 样式
public class CodeBlock{
static{
System.out.println("静态代码块!");
}
}
- 执行时机:静态代码块在类加载时就运行了,而且只运行一次并且优先于各种代码块以及构造函数。
- 作用:放置配置文件。
- 静态代码块不能存在任何方法体中。
- 静态代码块不能访问普通变量。
2、构造代码块:和静态代码块的区别是少了static关键字
- 样式
public class CodeBlock{
{
System.out.println("构造代码块!");
}
}
- 执行时机:在创建对象时被调用,每次创建对象都会调用一次,而且优于构造函数执行。
3、构造函数
- 样式
public class CodeBlock{
public CodeBlock(){
System.out.println("构造函数!");
}
}
- 执行时机:在类的对象创建时,定义初始化状态,没有返回值, 构造函数不能被直接调用,必须通过new运算符创建对象。
4、普通代码块
- 样式
public class CodeBlock{
public void SayHello(){
System.out.println("普通代码块!");
}
}
5、执行顺序
静态代码块 > 构造代码块 > 构造函数 > 普通代码块
- 例子
public class CodeBlock{
static{
System.out.println("静态代码块!");
}
{
System.out.println("构造代码块!");
}
public CodeBlock(){
System.out.println("构造函数!");
}
public void SayHello(){
System.out.println("普通代码块!");
}
public static void main(String[] args){
System.out.println("执行了main方法!");
new CodeBlock().SayHello();
System.out.println("----------");
new CodeBlock().SayHello();
}
}
运行结果:
静态代码块!
执行了main方法!
构造代码块!
构造函数!
普通代码块!
----------
构造代码块!
构造函数!
普通代码块!
6、父类和子类执行顺序
父类静态代码块 → 子类静态代码块 → 父类构造代码块和构造函数 → 子类构造函数和构造方法
父类:
public class SuperClass{
static{
System.out.println("父类静态代码块!");
}
{
System.out.println("父类构造代码块!");
}
public SuperClass(){
System.out.println("父类构造函数!");
}
}
子类:
public class SubClass extends SuperClass{
static{
System.out.println("子类静态代码块!");
}
{
System.out.println("子类构造代码块!");
}
public SubClass(){
System.out.println("子类构造函数!");
}
public static void main(String[] args){
SubClass sb = new SubClass();
System.out.println("----------");
SubClass sb = new SubClass();
}
}
结果:
父类静态代码块!
子类静态代码块!
父类构造代码块!
父类构造函数!
子类构造代码块!
子类构造函数!
----------
父类构造代码块!
父类构造函数!
子类构造代码块!
子类构造函数!