代码块分类:
(1)局部代码块
(2)构造代码块
(3)静态代码块
(4)同步代码块
1.局部代码块
局部代码块主要用来控制变量的生命周期。
1 public class MyTest1 { 2 public static void main(String[] args){ 3 { 4 int a = 1; 5 System.out.println(a); 6 } 7 System.out.println(a); // 报错 8 } 9 }
3-6行就是局部代码块,int a只在这个代码块里面有效。
2.构造代码块
构造代码块的作用是在创建对象时,需要实现其它附加东西时,需要用到的。
(1)无构造代码块时的书写:
public class MyTestDemo { public static void main(String[] args){ MyTest1 m1 = new MyTest1(); MyTest1 m2 = new MyTest1("小明",18); } } class MyTest1 { String name; int age; public MyTest1() { System.out.println("我是附加的功能"); } public MyTest1(String name, int age) { this.name = name; this.age = age; System.out.println("我是附加的功能"); } }
这两个构造方法明显有重复的部分,使用构造代码块就可以把重复的部分抽取出来。
(2)有构造代码块时的书写
public class MyTestDemo { public static void main(String[] args){ MyTest1 m1 = new MyTest1(); MyTest1 m2 = new MyTest1("小明",18); } } class MyTest1 { String name; int age; { System.out.println("我是附加的功能"); } public MyTest1() {} public MyTest1(String name, int age) { this.name = name; this.age = age; } }
注意:构造代码块优先于构造方法里面的代码执行!
3.静态代码块
随着类的加载而加载,只加载一次。一般应用于:加载类时需要做的一些初始化,比如加载驱动。
public class MyTestDemo { public static void main(String[] args){ MyTest1 m1 = new MyTest1(); MyTest1 m2 = new MyTest1("小明",18); } } class MyTest1 { String name; int age; static { System.out.println("加载驱动"); } public MyTest1() { } public MyTest1(String name, int age) { this.name = name; this.age = age; } }
4.同步代码块
保证在多线程的情况下,先执行完一个方法的完整代码,才会切换线程。
public class Demo4 { public static void main(String[] args) { Demo d = new Demo(); new Thread() { @Override public void run(){ while (true){ d.print1(); } } }.start(); new Thread() { @Override public void run(){ while (true){ d.print2(); } } }.start(); } } class Demo{ Object o = new Object(); public void print1(){ synchronized (o){ // synchronized ()传入一个对象即可,相当于一把锁 System.out.print("我"); System.out.print("好"); System.out.print("饿"); System.out.print("啊"); System.out.print(" "); } } public void print2(){ synchronized (o){ // synchronized () 传入的对象要和上面的一样 System.out.print("想"); System.out.print("吃"); System.out.print("汉"); System.out.print("堡"); System.out.print("包"); System.out.print(" "); } } }