前言🙉
代码块类似于一种优化(补充)构造器的机制,也是类中的一部分,按照路线学习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修饰,调用普通成员的地方立马报错!
✔️说明静态代码块只能调用静态成员