java中的代码块

代码块分类:

(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("\n");
        }
    }

    public void print2(){
        synchronized (o){                             // synchronized () 传入的对象要和上面的一样
                System.out.print("想");
                System.out.print("吃");
                System.out.print("汉");
                System.out.print("堡");
                System.out.print("包");
                System.out.print("\n");
        }
    }
}

 

posted @ 2019-01-02 16:12  苦瓜爆炒牛肉  阅读(205)  评论(0编辑  收藏  举报