上海略帮一下网络科技有限公司

上海略帮一下网络科技有限公司

Java SE代码块及其相关概念

admin

@TOC

代码块类似于一种优化(补充)构造器的机制,也是类中的一部分,按照路线学习java的过程中不断体会到了各种优化基础思维的新东西,我想以后的SSM应该也是这种思想的一种延续

一.定义及语法

1.定义

**代码块又称初始代码块,和构造器,成员方法,成员属性一样是类中的成员,他将逻辑语句封装在方法体中,通过{}包装起来。
代码块没有方法名,没有返回值没有参数,只有一个方法体,他不通过类或者类的对象显式调用,而是在类的加载时出现,或者创建类的对象时隐式调用
所谓的隐式调用,即不用写出对象调用的成员,类一加载就自动调用,如下**

2.语法:

[修饰符]{
  代码 
}

3.注意事项:

1.修饰符可以写可不写,如果要写,只能是static
2.代码块分为,静态代码块和非静态代码块
3.代码块调用顺序优先于构造器,不管调用哪个构造器来初始化对象都会先调用代码块内容

✔️例如:

public class Play {
    public static void main(String[] args) {
        new AAA("彭于晏"); //创建对象发生类加载 隐式调用了代码块
    }
}
class AAA{
    public String name="彭于晏";

    public AAA(String name) {  //构造器
        System.out.println("1.构造器被调用啦~");
        this.name = name;
    }
    {//代码块
        System.out.println("2.彭于晏好帅啊~~");
    }
}

▶️运行结果:

二.代码块与类的联系

1.普通的代码块

普通代码块在创建对象对象实例时被隐式调用,被创建一次就调用一次

2.static修饰的代码块

static代码块也叫静态代码块,同样可以理解成是对类的初始化,而且它随着➖类的加载而执行➖,且只会➖执行一次

✔️例如:

public class Play {
    public static void main(String[] args) {
        new AAA();//创建对象发生类加载 隐式调用了代码块
        new AAA();
        new AAA();
    }
}
class AAA{
    static {  //静态代码块
        System.out.println("静态代码块被调用");
    }
    {     //普通代码块
        System.out.println("普通代码块被调用");
    }
}

▶️运行结果:

✔️很显然,上述程序中,类加载了三次普通代码块随着类加载调用了三次,而静态代码块只加载了一次

三.类被加载的情况(重点)

1.在创建对象实例时,类加载
2.继承关系中创建子类对象实例,父类也会被加载(先父后子)
3.使用类的静态成员时(静态属性,静态方法)

四.类中成员的调用顺序(面试)

1.创建普通对象时

1️⃣调用静态代码块静态属性(两者谁写在前面就调用谁)
2️⃣普通代码块和普通属性
3️⃣构造方法
✔️例如:

public class Play {
    public static void main(String[] args) {
        new AAA("彭于晏");//创建对象发生类加载 隐式调用了代码块
    }
}
class AAA{
    public String name="彭于晏";

    public AAA(String name) {
        System.out.println("1.构造器被调用啦~");
        this.name = name;
    }
    static {
        System.out.println("2.静态代码块被调用");
    }
    {
        System.out.println("3.普通代码块被调用");
    }
}

▶️运行结果:

2.创建子类对象时

1️⃣父类的静态代码块和静态属性
2️⃣子类的静态代码块和静态属性
3️⃣父类的普通代码块和普通属性
4️⃣父类构造方法
5️⃣子类的普通代码块和普通属性
6️⃣子类构造方法
✔️例如:

public class Play {
    public static void main(String[] args) {
        new BBB("彭于晏");//创建对象发生类加载 隐式调用了代码块
    }
}
class AAA{
    public String name;
    public AAA(String name) {
        System.out.println("1.父类构造器被调用啦~");
        this.name = name;
    }
    static {
        System.out.println("2.父类静态代码块被调用");
    }
    {
        System.out.println("3.父类普通代码块被调用");
    }
}
class BBB extends AAA{
    public BBB(String name) {
        super(name);
        System.out.println("1.子类构造器被调用啦~");
    }
    static {
        System.out.println("2.子类静态代码块被调用");
    }
    {
        System.out.println("3.子类普通代码块被调用");
    }
}

▶️运行结果:

五.调用范围

⭕普通代码块可以调用任意成员
✔️例如:

class CCC{
    public String name="懒羊羊";
    public static int age=20;
    public void play(){
        System.out.println("今天你玩耍了吗");
    }
    public static void study(){
        System.out.println("今天你学习了吗");
    }
    {
    play();                   //普通代码块调用普通方法
    System.out.println(name);;//普通代码块调用普通属性
    System.out.println(age);; //普通代码块调用静态属性
    study();                  //普通代码块调用静态方法
    }
}

▶️运行结果:

⭕静态代码块只能调用静态成员
✔️例如:
在上述代码基础上,把普通代码块前加上static修饰,调用普通成员的地方立马报错!

✔️说明静态代码块只能调用静态成员