Java 代码块的含义理解

如下:
一种带有static
static{
    //代码内容
    //........
    //代码结束
}

还有就是花括号前面啥也没有的。
{
    //代码内容
    //........
    //代码结束
}

static{
  //代码内容
  //........
  //代码结束
}
静态代码域,在类的加载的时候调用一次,整个生命周期只会调用一次。
{
  //代码内容
  //........
  //代码结束
}
普通代码域,在类的每个对象创建的时候调用。

代码域中定义的变量都是局部的,只有域中的代码可以调用。

或者也称为 “静态代码块”和“非静态代码块”

 

static{}静态代码块,在类第一次被调用或实例化的时候就会被执行。 
静态代码块只会执行一次,一般会用来初始化一些值,并且在所有对象中全局共享。
{}非静态代码块,非静态代码块是在创建对象时自动执行的代码,不创建对象不执行该类的非静态代码块。 

在网上搜了下,有人举了个这样的例子进行说明,感觉非常到位:

举个例子:
public class TestStaticCon {   

        public static int a = 0;   
      
        static {   
            a = 10;   
            System.out.println("父类的非静态代码块在执行a=" + a);   
        }   
           
        {   
            a = 8;   
            System.out.println("父类的非静态代码块在执行a=" + a);   
        }   
      
        public TestStaticCon() {   
            this("a在父类带参构造方法中的值:" + TestStaticCon.a); // 调用另外一个构造方法   
            System.out.println(a);   
            System.out.println("父类无参构造方法在执行a=" + a);   
        }   
      
        public TestStaticCon(String n) {   
            System.out.println(n);   
            System.out.println(a);   
      
        }   
      
        public static void main(String[] args) {   
            TestStaticCon tsc = null;   
            System.out.println("!!!!!!!!!!!!!!!!!!!!!");   
            tsc = new TestStaticCon();   
        }/*Output:  
               父类的非静态代码块在执行a=10  
               !!!!!!!!!!!!!!!!!!!!!  
               父类的非静态代码块在执行a=8  
               a在父类带参构造方法中的值:10  
               8  
               8  
               父类无参构造方法在执行a=8  
               */  
      
    }  

public class TestStaticCon {   

        public static int a = 0;   
      
        static {   
            a = 10;   
            System.out.println("父类的非静态代码块在执行a=" + a);   
        }   
           
        {   
            a = 8;   
            System.out.println("父类的非静态代码块在执行a=" + a);   
        }   
      
        public TestStaticCon() {   
            this("a在父类带参构造方法中的值:" + TestStaticCon.a); // 调用另外一个构造方法   
            System.out.println(a);   
            System.out.println("父类无参构造方法在执行a=" + a);   
        }   
      
        public TestStaticCon(String n) {   
            System.out.println(n);   
            System.out.println(a);   
      
        }   
      
        public static void main(String[] args) {   
            TestStaticCon tsc = null;   
            System.out.println("!!!!!!!!!!!!!!!!!!!!!");   
            tsc = new TestStaticCon();   
        }/*Output:  
               父类的非静态代码块在执行a=10  
               !!!!!!!!!!!!!!!!!!!!!  
               父类的非静态代码块在执行a=8  
               a在父类带参构造方法中的值:10  
               8  
               8  
               父类无参构造方法在执行a=8  
               */  
      
    }  

 

  这里代码块{} 插入代码的理解的要点,在于两点:

 1. static {} 这种代码块在类被引用的时候就会被调用并执行a=10,无论创建对象与否。

 2. {...} 代码块在创建对象时,进入构造函数开始执行第一条语句之前调用该代码块并执行修改a=8。

 

 无论是哪种代码块方式, 都会对全局变量进行修改!!!!

 

 

 


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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值