作用
用来初始化类或对象信息。代码块只能使用 static 修饰
分类
- 静态代码块:使用static修饰
- 非静态代码块:没有使用static修饰
静态代码块
- 随着类的加载而执行
- 由于类的加载只会执行一次,进而静态代码块的执行,也只会执行一次
- 作用:用来初始化类的信息
- 内部可以声明变量、调用属性或方法、编写输出语句等操作
- 静态代码块的执行要先于非静态代码块的执行
- 如果声明有多个静态代码块,则按照声明的先后顺序执行
- 静态代码块内部只能调用静态的结构(即静态的属性、方法),不能调用非静态的结构(即非静态的属性、方法)
非静态代码块
- 随着对象的创建而执行
- 每创建当前类的一个实例,就会执行一次非静态代码块
- 作用:用来初始化对象的信息
- 内部可以声明变量、调用属性或方法、编写输出语句等操作
- 如果声明有多个非静态代码块,则按照声明的先后顺序执行
- 非静态代码块内部可以调用静态的结构(即静态的属性、方法),也可以调用非静态的结构(即非静态的属性、方法)
代码块示例
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63
| package com.base.learn;
public class BlockTest { public static void main(String[] args) { String desc = Person.desc; System.out.println("---------"); Person p1 = new Person(); } }
class Person { String name; int age; static String desc = "人类";
public Person() {
}
public Person(String name, int age) { this.name = name; this.age = age; }
static { System.out.println("Hello, Static Block-1"); desc = "hello,"; } static { System.out.println("Hello, Static Block-2"); }
{ System.out.println("Hello, Block"); desc = "heihei"; eat(); }
public void eat() { System.out.println("吃饭"); }
@Override public String toString() { return "Person{" + "name='" + name + '\'' + ", age=" + age + '}'; } }
|
代码块的执行顺序
通过下面这两段代码,搞清楚代码块的执行顺序
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84
| package com.base.learn;
class Root { static { System.out.println("Root 的静态代码块"); }
{ System.out.println("Root 的普通代码块"); }
public Root() { System.out.println("Root 空参构造器"); } }
class Mid extends Root { static { System.out.println("Mid 的静态代码块"); }
{ System.out.println("Mid 的普通代码块"); }
public Mid() { System.out.println("Mid 空参构造器"); }
public Mid(String msg) { this(); System.out.println("Mid 带参构造器 " + msg); } }
class Leaf extends Mid { static { System.out.println("Leaf 的静态代码块"); }
{ System.out.println("Leaf 的普通代码块"); }
public Leaf() { super("天天向上"); System.out.println("Leaf 空参构造器"); } }
public class LeafTest { public static void main(String[] args) { new Leaf(); System.out.println("--------------"); new Leaf(); } }
|
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46
| package com.base.learn;
class Father { static { System.out.println("111111111"); }
{ System.out.println("222222222"); }
public Father() { System.out.println("333333333"); } }
public class SonTest extends Father { static { System.out.println("444444444"); }
{ System.out.println("555555555"); }
public SonTest() { System.out.println("666666666"); }
public static void main(String[] args) { System.out.println("777777777"); System.out.println("******************"); new SonTest();
} }
|
变量赋值初始化过程
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25
| package com.base.learn;
public class Order1 { public static void main(String[] args) { Ord ord = new Ord(); System.out.println(ord.orderId); } }
class Ord { { orderId = 4; } int orderId = 3; }
|