什么是代码块
将代码写入一对括号内的{ },就可以称为代码块
根据位置不同可以分为:局部代码块,静态代码块,构造代码块,同步代码块
局部代码块
局部代码块出现在方法中,他是限量的生命周期,就在{ }的作用范围内,提高了内存的利用率
{ }外是访问不到里面的内容
局部代码块在一个方法内是自上而下依次执行的
public class testdemo {
public static void main(String[] args) {
{
int x=1;
System.out.println(x);
}
{
int y=1;
System.out.println(y );
}
}
}
构造代码块
出现在类中方法外,他在每次调用构造时都执行,并且在构造方法前
位置如下:
public class Demo {
{
System.out.println("构造代码块");
}
public Demo() {
System.out.println("构造方法");
}
}
public class testdemo {
public static void main(String[] args) {
Demo demo = new Demo();
}
}
我先创建这个方法的对象,
来康康执行结果,构造代码块的执行确实是在构造方法前
静态代码块
在类中方法外执行,加上了static修饰(那不就是上面的构造代码块加了static)
它随着类的加载而加载
public class Demo {
static {
System.out.println("静态代码块");
}
{
System.out.println("构造代码块");
}
public Demo() {
System.out.println("构造方法");
}
}
测试类中之执行一下
加上局部代码块后的顺序
直接看结果:
public class testdemo {
public static void main(String[] args) {
{
System.out.println("局部代码块");
}
Demo demo = new Demo();
}
}
那么执行顺序应该是局部代码块-> 静态代码块 ->构造代码块-> 构造方法?
我们把局部代码块挪个位置:
public class testdemo {
public static void main(String[] args) {
Demo demo = new Demo();
{
System.out.println("局部代码块");
}
}
}
所以局部代码块的位置是由我们自己放的位置决定执行顺序的
子类与父类中的执行顺序
这里我们需要写静态代码块,静态方法,构造代码块
父类
public class Fu {
static {
System.out.println("这是父类的静态代码块");
}
{
System.out.println("这是父类的构造代码块");
}
public Fu() {
System.out.println("这是父类的构造方法");
}
}
子类
class Zi extends Fu{
static{
System.out.println("这是子类的静态代码块");
}
public Zi() {
System.out.println("这是子类的构造方法");
}
{
System.out.println("这是子类的构造代码块");
}
}
test类测试
public class testdemo {
public static void main(String[] args) {
Zi zi = new Zi();
}
}
所以执行顺序是
父类的静态代码块 ->子类的静态代码块 ->父类的构造代码块 -> 父类的构造方法 -> 子类的构造代码块 ->子类的构造方法
我们来解释原因:静态代码块是随着类的加载而加载,所以最快,然后当子类创建对象的时候你必须先初始化父类,也就是加载父类的构造方法,构造代码块的执行在构造方法前,最后轮到子类的构造代码块,构造方法