面向对象--代码块的执行顺序

目录

一.局部代码块

二.构造代码块

三.静态代码块

四.理解代码块执行顺序 

五.有继承关系执行代码块顺序

一.局部代码块

只在方法中出现,当作正常的代码看待即可,使用大括号括起来的代码。

局部代码块的优点:使用完毕及早释放,提高内存的使用率。

public class Test1 {
    public static void main(String[] args) {
        {
            int a = 10;
            System.out.println(a);
        }

//            System.out.println(a);
    }
}
局部代码块运行完毕时及早释放,所以外部读取不到变量a。

二.构造代码块

  • 位置: 类中方法外定义

  • 特点: 每次构造方法执行的时侯,都会执行该代码块中的代码,并且在构造方法执行前执行

  • 作用: 将多个构造方法中相同的代码,抽取到构造代码块中,提高代码的复用性

ublic class Test1 {
    public static void main(String[] args) {
//每new一次对象都会执行一遍构造代码块,之后再执行一遍构造方法
        Student stu1 = new Student();
        Student stu2 = new Student(10);
    }
}
class Student {

    {
        System.out.println("好好学习");
    }

    public Student(){
        System.out.println("空参数构造方法");
    }

    public Student(int a){
        System.out.println("带参数构造方法");
    }
}

输出结果:

好好学习
空参数构造方法
好好学习
带参数构造方法

三.静态代码块

  • 位置: 类中方法外定义

  • 特点: 需要通过static关键字修饰,随着类的加载而加载,并且只执行一次

  • 作用: 在类加载的时候做一些数据初始化的操作

 

public class Test1 {
    public static void main(String[] args) {
        Person p1 = new Person();
        Person p2 = new Person(10);
    }
}

class Person {
    static {
        System.out.println("我是静态代码块, 我执行了");
    }

    public Person(){
        System.out.println("我是Person类的空参数构造方法");
    }

    public Person(int a){
        System.out.println("我是Person类的带参数构造方法");
    }
}
输出结果:
我是静态代码块, 我执行了
我是Person类的空参数构造方法
我是Person类的带参数构造方法

四.理解代码块执行顺序 

 

//局部代码块、构造代码块、静态代码块
class Demo {
//无参构造方法
    Demo() {
        System.out.println("Demo无参构造方法");
    }
//构造代码块
    {
        int x = 200;
        System.out.println(x);
    }
//静态代码块
    static {
        int w = 99;
        System.out.println(w);
    }
}

 public class CodeDemo {
    CodeDemo() {
        System.out.println("CodeDemo无参构造方法");
    }

    {
        int q = 500;
        System.out.println(q);
    }

    static {
        int r = 700;
        System.out.println(r);
    }
    public static void main(String[] args) {
        {
            int a = 100;
            System.out.println(a);
        }
        int a2 = 300;
        System.out.println(a2);
        {
            int b = 200;
            System.out.println(b);
        }
        Demo d = new Demo();
        System.out.println("------------------");
        CodeDemo codeDemo = new CodeDemo();
    }
}

输出结果:700
100
300
200
99
200
Demo无参构造方法
------------------
500
CodeDemo无参构造方法

解释:

运行程序,JVM会将class文件和静态成员加载到方法区中。JVM会先执行CodeDemo的静态代码块r,再把main方法加载到栈里面,执行main方法里面的 a➡a2➡b;之后调用无参构造方法为Demo创建对象d,执行w➡x➡Demo无参构造方法;最后调用无参构造方法为CodeDemo创建对象codeDemo,执行q➡y。
注意:这里没有r,由于静态代码块在被执行过一次之后,再次调用不执行。

五.有继承关系执行代码块顺序

执行顺序:

父类的静态代码块和静态属性->父类的构造代码块->父类的构造方法->子类的静态代码块和静态属性->父类的构造代码块->父类的构造方法->子类的构造代码块->子类的构造方法

class Fu{
    static {
        System.out.println("父类的静态代码块");
    }
    {
        System.out.println("父类的构造代码块");
    }
    public Fu(){
        System.out.println("父类的无参构造方法");
    }
}
class Zi extends Fu{
    static {
        System.out.println("子类的静态代码块");
    }
    {
        System.out.println("子类的构造代码块");
    }
    public Zi(){
     //隐含了super()
        System.out.println("子类的无参构造方法");
    }
}
public class Test {
    public static void main(String[] args) {
        new Fu();
        new Zi();
    }
}

输出结果:

父类的静态代码块
父类的构造代码块
父类的无参构造方法
子类的静态代码块
父类的构造代码块
父类的无参构造方法
子类的构造代码块
子类的无参构造方法

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值