代码块-Java
- 一、介绍
- 二、语法
- 三、好处
- 举例
- 四、使用细节
- 1、static代码块/静态代码块,随着类的加载而执行,且只执行一次
- 2、 类什么时候被加载 [重要 ! ]
- 案例演示:static代码块
- 3、普通代码块,在创建对象实例时,会被隐式的调用。
- 案例演示:普通代码块
一、介绍
代码化块又称为初始化块,属于类中的成员[即是类的一部分],类似于方法,将逻辑语句封装在方法体中,通过包围起来。
但和方法不同,没有方法名,没有返回,没有参数,只有方法体,而且不用通过对象或类显式调用,而是加载类时,或创建对象时隐式调用。
二、语法
[修饰符] {代码};注意:修饰符可选,要写的话,也只能写static。
- 修饰符可选,要写的话,也只能写static。
- 代码块分为两类,使用static修饰的叫静态代码块,没有static修饰的,叫普通代码块。
- 逻辑语句可以为任何逻辑语句(输入、输出、方法调用、循环、判断等)
- 分号 ; 号可以写上,也可以省略。
三、好处
- 相当于另外一种形式的构造器(对构造器的补充机制),可以做初始化的操作。
- 如果多个构造器中都有重复的语句,可以抽取到初始化块中,提高代码的重用性
- 代码块调用的顺序优先于构造器
举例
代码块的快速入门 CodeBlock01.java
class Movie {private String name;private double price;private String director;// 三个构造器->构成重载public Movie(String name) {System.out.println("电影屏幕打开……");System.out.println("广告开始……");System.out.println("电影正式开始……");this.name = name;}public Movie(String name, double price) {System.out.println("电影屏幕打开……");System.out.println("广告开始……");System.out.println("电影正式开始……");this.name = name;this.price = price;}public Movie(String name, double price, String director) {System.out.println("电影屏幕打开……");System.out.println("广告开始……");System.out.println("电影正式开始……");this.name = name;this.price = price;this.director = director;}
}
可以看到在每一个构造器中都有同样的代码
把相同的语句放在一个代码块中即可
{System.out.println("电影屏幕打开……");System.out.println("广告开始……");System.out.println("电影正式开始……");}//这样不管调用哪一个构造器创建对象,都会先调用代码块public Movie(String name) {System.out.println("public Movie(String name)");this.name = name;}public Movie(String name, double price) {System.out.println("public Movie(String name, double price)");this.name = name;this.price = price;}public Movie(String name, double price, String director) {System.out.println("public Movie(String name, double price, String director)");this.name = name;this.price = price;this.director = director;}
(1) 不管调用哪个构造器创建对象,都会先调用代码块
(2) 代码块调用的顺序优先于构造器
四、使用细节
1、static代码块/静态代码块,随着类的加载而执行,且只执行一次
static代码块也叫静态代码块,作用就是对类进行初始化,而且它随着类的加载而执行,并且只会执行一次。如果是普通代码块,每创建一个对象,就执行。
2、 类什么时候被加载 [重要 ! ]
① 创建对象实例时(new)
② 创建子类对象实例,父类也会被加载
③ 使用类的静态成员时(静态属性,静态方法)
案例演示:static代码块
① 创建对象实例时(new)
public class CodeBlockDetail01 {public static void main(String[] args) {A aa = new A();}
}class A {static {System.out.println("AA的静态代码块");}
}
② 创建子类对象实例,父类也会被加载
public class CodeBlockDetail01 {public static void main(String[] args) {B b = new B();}
}class A {static {System.out.println("父类A的静态代码块");}
}class B extends A {static {System.out.println("子类B的静态代码块");}
}
③ 使用类的静态成员时(静态属性,静态方法)
使用静态属性或者静态方法的时候,类已经加载
public class CodeBlockDetail01 {public static void main(String[] args) {//③ 使用类的静态成员时(静态属性,静态方法)System.out.println(Cat.n1);}
}
class Cat {public static int n1 = 999;static {System.out.println("cat 的静态代码块");}
}
static代码块/静态代码块,随着类的加载而执行,且只执行一次
public class CodeBlockDetail01 {public static void main(String[] args) {D d = new D();D d1 = new D();}
}
class D {static{System.out.println("DD的静态代码块");}
}
3、普通代码块,在创建对象实例时,会被隐式的调用。
普通代码块,在创建对象实例时,会被隐式的调用。每创建一次,就会调用一次。
如果只是使用类的静态成员时,普通代码块并不会执行。
案例演示:普通代码块
① 普通代码块,被创建一次,就会调用一次。
//【main】D d = new D();D d1 = new D();class D {static{System.out.println("D的static静态代码块");}{System.out.println("D的普通代码块");}}
② 只是使用类的静态成员时,普通代码块并不会执行。
注意:静态代码块一定会执行。
//【main】System.out.println(D.n2);class D {public static int n2 = 8888;static{System.out.println("D的static静态代码块");}{System.out.println("D的普通代码块");}}