静态代码块
1、格式
public class Book{
static{
System.out.println("我是静态代码块")
}
}
2、执行时间
静态代码块在类被加载的时候运行,且只执行一次,优先于任何代码块及构造函数。多个静态代码块之间按照书写顺序执行
3、作用
有些代码需要在项目启动的时候就执行,就会用到静态代码块,比如加载配置文件,我们就可以放入静态代码块。
4、注意
- 静态代码块不能存在于任何方法体中
- 静态代码块不能访问普通变量
- 普通方法和静态方法的区别
构造代码块
1、格式
两者的区别在于少了static关键字
public class Book{
static{
System.out.println("我是静态代码块");
}
{
System.out.println("我是构造代码块");
}
}
2、执行时间
构造代码块在创建对象时调用,每次创建都会调用一次,在构造函数之前执行,它依托于构造函数,如果不实例化对象,构造代码块也不执行
public class Book{
{
System.out.println("我是构造代码块");
}
public Book(){
System.out.println("无参构造函数");
}
public Book(String name){
System.out.println("有参构造函数");
}
}
反编译之后的class文件:
3、作用
可以用于对象的初始化,且只要创建一个对象,构造代码块都会执行一次。
利用每次创建对象都会调用一次构造代码块的特性,我们可以统计创建对象的次数
构造函数
1.构造函数的命名必须和类名完全相同。在java中普通函数可以和构造函数同名,但是必须带有返回值;
2.构造函数的功能主要用于在类的对象创建时定义初始化的状态。它没有返回值,也不能用void来修饰。这就保证了它不仅什么也不用自动返回,而且根本不能有任何选择。而其他方法都有返回值,即使是void返回值。尽管方法体本身不会自动返回什么,但仍然可以让它返回一些东西,而这些东西可能是不安全的;
3.构造函数不能被直接调用,必须通过new运算符在创建对象时才会自动调用;而一般的方法是在程序执行到它的时候被调用的;
4.当定义一个类的时候,通常情况下都会显示该类的构造函数,并在函数中指定初始化的工作也可省略,不过Java编译器会提供一个默认的构造函数.此默认构造函数是不带参数的。而一般的方法不存在这一特点;
普通代码块
普通代码块和构造代码块的区别在于,构造代码块在类中定义,而普通代码块在方法体中定义。按书写顺序执行
public void read(){
{
System.out.println("我是普通代码块");
}
}
执行顺序
静态代码块>构造代码块>构造函数>普通代码块
public class Book{
static{
System.out.println("我是静态代码块");
}
{
System.out.println("我是构造代码块");
}
public Book(){
System.out.println("我是无参构造函数");
}
public read(){
{
System.out.println("我是普通代码块");
}
}
public static void main(String[] args){
System.out.println("执行了main方法");
new Book().read();
System.out.println("------------------");
new Book().read();
}
}
反编译之后的class文件
执行结果:
父类和子类的执行顺序
- 执行父类的静态代码块
- 执行子类的静态代码块
- 执行父类的构造代码块
- 执行父类的构造方法
- 执行子类的构造代码块
- 执行子类的构造方法
父类:SuperClass
public class SuperClass{
static{
System.out.println("父类静态代码块");
}
{
System.out.println("父类构造代码块");
}
public SuperClass(){
System.out.println("父类构造函数");
}
}
子类:SubClass
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 sb1 = new SubClass();
}
打印结果:
父类静态代码块
子类静态代码块
父类构造代码块
父类构造函数
子类构造代码块
子类构造函数
父类构造代码块
父类构造函数
子类构造代码块
子类构造函数