Java中静态代码块的用法
- java静态代码块 静态方法 区别
一般情况下,有些代码必须在项目启动的时候就执行,需要使用静态代码块,它是自动执行的;
需要在项目启动的时候就初始化,在不创建对象的情况下,其他程序来调用的时候,需要使用静态方法,是在被调用的时候才执行的,静态方法在类加载的时候就已经加载,可以使用类名直接调用
使用静态方法时注意
1)在静态方法里只能直接调用同类中其他的静态成员(包括变量和方法),而不能直接访问类中的非静态成员 :::因为对于非静态的方法和变量,需要先创建类的实例对象后才可使用,而静态方法在使用前不用创建任何对象。
2)静态方法不能以任何方式引用this和super关键字。 - 静态代码块的初始化顺序
class Parent{
static String name = "hello";
{
System.out.println("parent block");
}
static {
System.out.println("parent static block");
}
public Parent(){
System.out.println("parent constructor");
}
}
class Child extends Parent{
static String childName = "hello";
{
System.out.println("child block");
}
static {
System.out.println("child static block");
}
public Child(){
System.out.println("child constructor");
}
}
public class StaticIniBlockOrderTest {
public static void main(String[] args) {
new Child();//语句(*)
}
}
打印的顺序是
parent static block
child static block
parent block
parent constructor
child block
child constructor
原因:
首先看父类里面有没有静态代码块,如果有,它会先执行父类里面静态代码块的内容,当父类的静态代码块内的内容执行完毕之后,再去执行子类的静态代码块;再看父类有没有非静态代码块,如果有就执行父类的非静态代码块,父类的非静态代码块执行完毕,接着执行父类的构造方法;父类的构造方法执行完毕之后,再去看子类有没有非静态代码块,如果有就执行子类的非静态代码块。子类的非静态代码块执行完毕再去执行子类的构造方法
注意
子类的构造方法,不管这个构造方法带不带参数,默认的它都会先去寻找父类的不带参数的构造方法,如果父类没有不带参数的构造方法,那么子类必须用super关键字来调用父类带参数的构造方法,否则编译不能通过