java中的代码块总结

在Java中,使用”{}”括起来的代码称为代码块,代码块可以分为以下四种:
1.普通代码块:就是类中方法的方法体
  public void xxx(){
      //code
  }
2.构造块:用{}裹起来的代码片段,构造块在创建对象时会被调用,每次创建对象时都会被调用,并且优先于类构造函数执行。 构造块中定义的变量是局部变量。
  {
     //code
  }
3.静态块:用static{}裹起来的代码片段,只会被执行一次(第一次加载此类时执行,比如说用Class.forName("")加载类时就会执行static  block),静态块优先于构造块执行。
  static{ 
     //code
  }
4.同步代码块:使用synchronized(obj){}裹起来的代码块,在多线程环境下,对共享数据进行读写操作是需要互斥进行的,否则会导致数据的不一致性。常见的是synchronized用来修饰方法,其语义是任何线程进入synchronized需要先取得对象锁如果被占用了,则阻塞,实现了互斥访问共享资源。而synchronized也是有代价的。一个常见的场景是,一个冗长的方法中,其实只有一小段代码需要访问共享资源,这时使用同步块,就只将这小段代码裹在synchronized  block,既能够实现同步访问,也能够减少同步引入的开销。 同步代码块须写在方法中。
    synchronized(obj){
        //code
    }


普通代码块

直接定义在方法中的代码块称为普通代码块。
public class CodeDemo01{
 public static void main(String args[]){
  {  // 普通代码块
   int x = 30 ; // 就属于一个局部变量
   System.out.println("普通代码块 --> x = " + x) ;
  }
  int x = 100 ;  // 与局部变量名称相同
  System.out.println("代码块之外 --> x = " + x) ;
 }
};
运行结果:
普通代码块 --> x = 30
代码块之外 --> x = 100


构造块:

将代码块直接定义在类中,则称为构造代码块。
class Demo{
 { // 直接在类中编写代码块,称为构造块
  System.out.println("1、构造块。") ;
 }
 public Demo(){ // 定义构造方法
  System.out.println("2、构造方法。") ;
 }
};
public class CodeDemo02{
 public static void main(String args[]){
  new Demo() ;  // 实例化对象
  new Demo() ;  // 实例化对象
  new Demo() ;  // 实例化对象
 }
};
运行结果:
1、构造块。
2、构造方法。
1、构造块。
2、构造方法。
1、构造块。
2、构造方法。
构造块优先于构造方法执行,且执行多次,只要一有实例化对象产生,就执行构造块中的内容。

若有多个构造块,按照顺序先后执行。

静态代码块:

直接使用static关键字声明就称为静态代码块.
class Demo{
 { // 直接在类中编写代码块,称为构造块
  System.out.println("1、构造块。") ;
 }
 static{ // 使用static,称为静态代码块
  System.out.println("0、静态代码块") ;
 }
 public Demo(){ // 定义构造方法
  System.out.println("2、构造方法。") ;
 }
};
public class CodeDemo03{
 static{  // 在主方法所在的类中定义静态块
  System.out.println("在主方法所在类中定义的代码块") ;
 }
 public static void main(String args[]){
  new Demo() ;  // 实例化对象
  new Demo() ;  // 实例化对象
  new Demo() ;  // 实例化对象
 }
};
运行结果:
在主方法所在类中定义的代码块
0、静态代码块
1、构造块。
2、构造方法。
1、构造块。
2、构造方法。
1、构造块。
2、构造方法。
静态块优先于主方法执行,如果在普通类中定义的静态块,优先于构造块执行,不管不多少个实例化对象产生,静态代码块只执行一次,静态代码块的主要功能就是为静态发生初始化。执行顺序:(优先级从高到低。)静态代码块>main方法>构造代码块>构造方法。

注意:如果继承体系中既有构造方法,又有静态代码块,那么首先执行最顶层的类的静态代码块,一直执行到最底层的静态代码快,然后再去执行最顶层类的构造方法,一直执行到最底层类的构造方法,注意:静态代码块只会执行一次。

错误示例:

public class Practice
{
    static String string = "static filed";//可以只声明,然后在静态块中赋值
    static {
        String strings = "static block";
        static void show(){//错误:静态方法不可声明在静态块中,并且如果要在静态代码块里写代码,不用写方法,直接写语句
            System.out.println("a method in static block");
        }
    }
    public static void say() {
        System.out.println(Practice.string);
		System.out.println(strings);//错误:strings 在静态块中,属于方法内的变量,是局部的,外部访问不到
    }
    public static void main(String[] args) {
         
        Practice.say();
     
    }
}



  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值