[修饰符]{
};
代码块相当于另一种形式的构造器,可以用作初始化的操作,不管调用哪个构造器,创建对象,都会优先调用代码块的内容,代码块调用的顺序要优先于构造器
package block_demo;
import java.io.File;
public class Film {
private String name;
private String desc;
static {
System.out.println("===========我是静态代码块,我是1号============");
}
static {
System.out.println("===========我是静态代码块,我是2号=============");
}
{
System.out.println("电影屏幕打开了...");
System.out.println("广告时间...");
System.out.println("电影开始了...");
};
{
System.out.println("-----------我是一个普通的代码块...----------");
}
public Film(String name) {
System.out.println("调用了 public Film(String name)");
this.name = name;
}
public Film(String name, String desc) {
System.out.println("调用了public Film(String name, String desc)");
this.name = name;
this.desc = desc;
}
public static void main(String[] args) {
Film film = new Film("你好,李焕英");
System.out.println("======================");
Film film1 = new Film("西游记", "中国四大名著之一改编电影");
}
}
结果
细节电影屏幕打开了…
广告时间…
电影开始了…
调用了 public Film(String name)
======================
电影屏幕打开了…
广告时间…
电影开始了…
调用了public Film(String name, String desc)
- static代码块也叫静态代码块,作用是对类进行初始化,而且它随着类的加载而执行,只会执行一次
- 普通代码块,每创建一个对象,就执行,如果使用类的静态成员时,普通代码块不会被执行
- 创建一个对象时,在一个类调用顺序:
- 调用静态代码块和静态属性初始化(静态代码块和静态属性初始化调用的优先级一样,如果有多个静态代码块和多个静态变量初始化,按照定义的顺序调用)
- 调用普通代码块和普通属性的初始化(注释同上)
- 调用构造方法
package block_demo;
import java.io.File;
public class Film {
private String name;
private String desc;
static {
System.out.println("我是静态代码块,我是1号");
}
{
System.out.println("电影屏幕打开了...");
System.out.println("广告时间...");
System.out.println("电影开始了...");
}
static {
System.out.println("我是静态代码块,我是2号");
}
public Film(String name) {
System.out.println("调用了 public Film(String name)");
this.name = name;
}
public Film(String name, String desc) {
System.out.println("调用了public Film(String name, String desc)");
this.name = name;
this.desc = desc;
}
public static void main(String[] args) {
Film film = new Film("你好,李焕英");
System.out.println("======================");
Film film1 = new Film("西游记", "中国四大名著之一改编电影");
}
}
结果
=我是静态代码块,我是1号==
=我是静态代码块,我是2号===
电影屏幕打开了…
广告时间…
电影开始了…
-----------我是一个普通的代码块…----------
调用了 public Film(String name)
======================
电影屏幕打开了…
广告时间…
电影开始了…
-----------我是一个普通的代码块…----------
调用了public Film(String name, String desc)
首先执行的是静态代码块,然后是普通代码块
- 构造器的最前面隐藏了super()和调用普通代码块
package block_demo;
public class Demo1 {
public static void main(String[] args) {
// 加载类,调用父类和本类的静态代码块
new B();
}
}
class A{
// 普通代码块
{
System.out.println("我是A类的普通代码块");
}
// 静态代码块
static {
System.out.println("我是A类的静态代码块");
}
public A() {
System.out.println("我是A类的构造器");
}
}
class B extends A {
// 普通代码块
{
System.out.println("我是B类的普通代码块");
}
// 静态代码块
static {
System.out.println("我是B类的静态代码块");
}
public B() {
// super()
// 本类的普通代码块
System.out.println("我是B类的构造器");
}
}
结果
我是A类的静态代码块
我是B类的静态代码块
我是A类的普通代码块
我是A类的构造器
我是B类的普通代码块
我是B类的构造器
package com.hspedu.codeblock_;
public class CodeBlockDetail04 {
public static void main(String[] args) {
//老师说明
//(1) 进行类的加载
//1.1 先加载 父类 A02 1.2 再加载 B02
//(2) 创建对象
//2.1 从子类的构造器开始
//new B02();//对象
new C02();
}
}
class A02 { //父类
private static int n1 = getVal01();
static {
System.out.println("A02的一个静态代码块..");//(2)
}
{
System.out.println("A02的第一个普通代码块..");//(5)
}
public int n3 = getVal02();//普通属性的初始化
public static int getVal01() {
System.out.println("getVal01");//(1)
return 10;
}
public int getVal02() {
System.out.println("getVal02");//(6)
return 10;
}
public A02() {//构造器
//隐藏
//super()
//普通代码和普通属性的初始化......
System.out.println("A02的构造器");//(7)
}
}
class C02 {
private int n1 = 100;
private static int n2 = 200;
private void m1() {
}
private static void m2() {
}
static {
//静态代码块,只能调用静态成员
//System.out.println(n1);错误
System.out.println(n2);//ok
//m1();//错误
m2();
}
{
//普通代码块,可以使用任意成员
System.out.println(n1);
System.out.println(n2);//ok
m1();
m2();
}
}
class B02 extends A02 { //
private static int n3 = getVal03();
static {
System.out.println("B02的一个静态代码块..");//(4)
}
public int n5 = getVal04();
{
System.out.println("B02的第一个普通代码块..");//(9)
}
public static int getVal03() {
System.out.println("getVal03");//(3)
return 10;
}
public int getVal04() {
System.out.println("getVal04");//(8)
return 10;
}
//一定要慢慢的去品..
public B02() {//构造器
//隐藏了
//super()
//普通代码块和普通属性的初始化...
System.out.println("B02的构造器");//(10)
// TODO Auto-generated constructor stub
}
}
类什么时候被加载
- new
- 创建子类对象实例,父类也会被加载
- 使用类的静态成员时



