Java中的代码块

简介: Java中的代码块

认识代码块

1.1什么是代码块

使用 {} 定义的一段代码.


根据代码块定义的位置以及关键字,又可分为以下四种:


普通代码块(了解即可,一般不会用)

构造块(实例代码块)

静态代码块

同步代码块(后续讲解多线程部分再谈)

1.2普通代码块

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

public class Main{
    public static void main(String[] args) {
        {
            //直接使用{}定义,普通方法块
            int x = 10 ;
            System.out.println("x1 = " +x);
        }
        int x = 100 ;
        System.out.println("x2 = " +x);
    }
}
// 执行结果
x1 = 10
x2 = 100

这种用法较少见。


1.3构造代码块

构造块:定义在类中的代码块(不加修饰符)。也叫:实例代码块。构造代码块一般用于初始化实例成员变量。

class Person {
    private String name;//实例成员变量private int age;
    private String sex;
    public Person() {
        System.out.println("I am Person init()!");
    }
    //实例代码块
    {
        this.name = "bit";
        this.age = 12;
        this.sex = "man";
        System.out.println("I am instance init()!");
    }
    public void show() {
        System.out.println("name: " + name + " age: " + age + " sex: " + sex);
    }
}
public class Main {
    public static void main(String[] args) {
        Person p1 = new Person();
        p1.show();
    }
}
// 运行结果
I am instance init()! 
I am Person init()!
name: bit age: 12 sex: man


注意事项: 实例代码块优先于构造函数执行。


1.4静态代码块

使用static定义的代码块。一般用于初始化静态成员属性。


代码示例:此处思考最终的输出结果是多少呢?

class Person2 {
    private String name;//实例成员变量
    private int age;
    private String sex;
    private static int count = 0;//静态成员变量
    public Person2() {
        System.out.println("I am Person init()!");
    }
    //实例代码块
    {
        this.name = "bit";
        this.age = 12;
        this.sex = "man";
        System.out.println("I am instance init()!");
    }
    //静态代码块
    static {
        count = 10;//只能访问静态数据成员
        System.out.println("I am static init()!");
    }
    public void show() {
        System.out.println("name: " + name + " age: " + age + " sex: " + sex);
    }
}
public class LeiHeDuiXiang6 {
    public static void main(String[] args) {
        Person2 p1 = new Person2();
        Person2 p2 = new Person2();
    }
}

注意事项:

1.静态代码块不管生成多少个对象,其只会执行一次,且是最先执行的。
2.静态代码块执行完毕后, 实例代码块(构造块)执行,再然后是构造函数执行。(重点)
所以我们可以推断出上述代码最终的输出结果为:
I am static init()!
I am instance init()!
I am Person init()!
I am instance init()!
I am Person init()!


此时我们来修改下代码再看两个问题:

class Person2 {
    private String name;//实例成员变量
    private int age;
    private String sex;
    public static int count = 0;//静态成员变量
    public Person2() {
        System.out.println("I am Person init()!");
    }
    //实例代码块
    {
        this.name = "bit";
        this.age = 12;
        this.sex = "man";
        System.out.println("I am instance init()!");
    }
    //静态代码块
    static {
        count = 10;//只能访问静态数据成员
        System.out.println("I am static init()!");
    }
    public void show() {
        System.out.println("name: " + name + " age: " + age + " sex: " + sex);
    }
}
public class LeiHeDuiXiang6 {
    public static void main(String[] args) {
        System.out.println(Person2.count);
    }
}
//执行结果
I am static init()!
10

此时若只单独执行System.out.println(Person2.count);这一行语句的时候,首先会先执行静态代码块,然后执行输出语句System.out.println(Person2.count)。


count最终的输出值为10,原因是此时首先在类中定义count为0后,在静态代码块中又对count重新赋值了一个10,


假如此时我们调换类中代码的书写顺序,即静态代码块在前,public static int count = 0这条赋值语句在后的话,则最终输出结果为0.


此时我们会发现若单独执行这一条语句,实例代码块和构造函数是不会被执行的,只会执行一次静态代码块,这是为什么?

答:原因是我们是count是静态的变量,是不依赖对象的,是可以通过类直接访问的,这期间并没有发生对象的实例化,所以对象实例代码块以及构造函数是都不会执行的


相关文章
|
7月前
|
Arthas Java 中间件
如何优雅的在java中统计代码块耗时
如何优雅的在java中统计代码块耗时
90 1
|
2月前
|
Java 编译器
【一步一步了解Java系列】:子类继承以及代码块的初始化
【一步一步了解Java系列】:子类继承以及代码块的初始化
137 3
|
4月前
|
Java 程序员 API
从代码中寻找平衡:’java代码块和具体的代码应用
Java 8 引入的 Lambda 表达式是一项革命性特性,使编写简洁、灵活且易维护的代码成为可能。Lambda 表达式作为一种匿名函数,支持任意数量参数和返回值,其基本语法为 `(parameters) -> expression` 或 `(parameters) -> { statements; }`。
38 0
|
4月前
|
Java
【Java】代码块
【Java】代码块
|
6月前
|
Java
Java中代码块区别及代码示例
Java中代码块区别及代码示例
33 0
|
6月前
|
Java C++
Java 基础内容(代码块)
Java 基础内容(代码块)
23 0
|
6月前
|
Java 编译器
Java中4种代码块:普通代码块,静态代码块,同步代码块,构造代码块
Java中4种代码块:普通代码块,静态代码块,同步代码块,构造代码块
251 0
|
6月前
|
Java
java代码块和具体的代码应用
java代码块和具体的代码应用
36 0
|
7月前
|
Java
【JAVA学习之路 | 基础篇】类的成员--代码块
【JAVA学习之路 | 基础篇】类的成员--代码块
|
6月前
|
Java
Java基础8-一文读懂Java 代码块和执行顺序(二)
Java基础8-一文读懂Java 代码块和执行顺序(二)
69 0