Java中的类和对象之代码块

系列文章目录

Java中的类和对象系列



一、代码块的概念及分类

使用{}定义的一段代码称为代码块。根据代码块定义的位置以及关键字,又可分为以下四种

    普通代码块 构造块 静态块 同步代码块(后面讲多线程再谈)

今天我们主要讲构造块和静态块。

1.普通代码块

这里,我们还是先提一嘴普通代码块:

public Class Main{
    public static void main(String[] args) {
        {
            int x = 10;
            System.out.println(“这是一个普通代码块”);
        }
        System.out.println(x);//报错
    }
}

普通代码块仅仅起到一个限制变量作用域的问题。

2.构造代码块

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

public class Student {
    private String name;
    private int num;
    private String sex;
    private static int Class = 1;
    public Student() {
        System.out.println("这是构造方法的第一句!");
        this.num = 21;
    }
    public Student(int num) {
        System.out.println("这是构造方法的第一句!");
        this.num = num;
    }
    {
        this.name = "Janssen";
        //this.num = 21;
        this.sex = "man";
        System.out.println("这是一个构造块!");
    }
    public String toString(){
        return "name:"+this.name+" num:"+this.num+" sex:"+this.sex+" class:"+ Class;
    }

    public static void main(String[] args) {
        Student a = new Student();
        Student b = new Student();
        System.out.println(a);
        System.out.println(b);
    }

}
如下是输出结果: 这是一个构造块! 这是构造方法的第一句! 这是一个构造块! 这是构造方法的第一句! name:Janssen num:21 sex:man class:1 name:Janssen num:22 sex:man class:1

由输出结果我们不难看出,构造块优先于构造方法先执行,因为在编译完成后,编译器会将构造块中的代码拷贝到每一个构造方法的第一条语句前!

因此,构造块的意义在于简化多个构造方法的冗余量,简化重复代码量。构造代码块只有在创建对象时才会执行。

3.静态代码块

如果说构造块是用来初始化实例成员变量的,那么静态代码块就是用来初始化静态成员变量的。

代码块我们也用static来修饰:

public class Student {
    private String name;
    private int num;
    private String sex;
    private static int Class = 1;
    public Student() {
        System.out.println("这是构造方法的第一句!");
    }
    {
        this.name = "Janssen";
        this.num = 21;
        this.sex = "man";
        System.out.println("这是一个构造块!");
    }
    static{
        Class = 2;
        System.out.println("这是一个静态代码块!");
    }
    public static int getclass(){
        return Class;
    }
    public String toString(){
        return "name:"+this.name+" num:"+this.num+" sex:"+this.sex+" class:"+ Class;
    }

    public static void main(String[] args) {
        Student a = new Student();
        System.out.println(a);
    }

}
这是一个静态代码块! 这是一个构造块! 这是构造方法的第一句! name:Janssen num:21 sex:man class:2

由输出结果我们可以看出:

    静态代码块在虚拟机加载类的时候就会加载执行,它优先于构造块 而且不管生成多少个对象,静态代码块都只执行一次! 如果静态变量已经初始化,静态代码块可以对其重新赋值(除非final定义)

经验分享 程序员 微信小程序 职场和发展