Java代码块(*)

代码块:使用{ }定义的一段代码。
根据代码块定义的位置以及关键字,分为4种:
1)普通代码块
2)构造块
3)静态块
4)同步代码块 — 多线程

1、普通代码块

普通代码块:定义在方法中的代码块

public class Test {
    public static void main(String[] args) {
        {
        //普通代码块
            int x = 10;
            System.out.println("x = " + x);
        }
        int x = 100;
        System.out.println("x = "+ x);
    }
}

2、构造块

构造块:定义在类中的代码块(不加修饰符)

class Person{
    {
        //构造块
        System.out.println("1、Person类的构造块");
    }
    public Person(){
        System.out.println("2、Person类的构造方法");
    }
}

public class Test {
    public static void main(String[] args) {
        new Person();
        new Person();
    }
}

在这里插入图片描述
通过以上代码可以发现:构造块优先于构造方法执行,每产生一个新的对象就调用一次构造块,构造块可以进行简单的逻辑操作(在调用构造方法之前)。

3、静态代码块

静态代码块:使用static定义的代码块

3.1 在非主类中的静态代码块
class Person{
    {
        //构造块
        System.out.println("1、Person类的构造块");
    }
    public Person(){
        System.out.println("2、Person类的构造方法");
    }
    static {
        System.out.println("3、Person类的静态块");
    }
}

public class Test {
    public static void main(String[] args) {
        System.out.println("======start======");
        new Person();
        new Person();
        System.out.println("======end======");
    }
}

在这里插入图片描述
通过以上代码可以发现:静态块优先于构造块执行,无论产生多少实例对象,静态块都只执行一次。
静态块的主要作用是为static属性进行初始化

3.2 在主类中的代码块
public class Test {
    {
        System.out.println("1、Test的构造块");
    }
    public Test(){
        System.out.println("2、Test的构造方法");
    }
    static {
        System.out.println("3、Test的静态块");
    }
    public static void main(String[] args) {
        System.out.println("======start======");
        new Test();
        new Test();
        System.out.println("======end======");
    }
}

在这里插入图片描述
通过以上代码可以发现:在主类中定义的静态块,优先于main方法执行。

如果一些属性需要在使用前做处理,可以考虑使用代码块。

小试牛刀
这是一道阿里的Java校招笔试题:

class HelloA{
    public HelloA(){
        System.out.println("Hello A!父类构造方法");
    }
    {
        System.out.println("I'm A class.父类非静态代码块");
    }
    static {
        System.out.println("static A 父类静态代码块");
    }
}

public class HelloB extends HelloA{
    public HelloB(){
        System.out.println("Hello B! 构造方法");
    }
    {
        System.out.println("I'm B class.非静态代码块");
    }
    static {
        System.out.println("static B 静态代码块");
    }

    public static void main(String[] args) {
        System.out.println("======start======");
        new HelloB();
        new HelloB();
        System.out.println("======end======");
    }
}

结果为:
在这里插入图片描述

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值