static{}(静态代码块)与{}(非静态代码块)的异同点

本文详细解析了Java中的静态与非静态代码块的区别、执行顺序及应用场景,帮助开发者更好地掌握类初始化机制。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

相同点:都是在JVM加载类时且在构造方法执行之前执行,在类中都可以定义多个,一般在代码块中对一些static变量进行赋值。
不同点:静态代码块在非静态代码块之前执行(静态代码块—>非静态代码块—>构造方法)。

静态代码块只在第一次new执行一次,之后不再执行,而非静态代码块在每new一次就执行一次。非静态代码块可在普通方法中定义(不过作用不大);而静态代码块不行。

例:
//普通类

public class PuTong {     
        public PuTong(){ 
           System.out.print("默认构造方法!-->");    
        }
  
        //非静态代码块     
        { 
            System.out.print("非静态代码块!-->");     
        }
 
        //静态代码块     
        static{ 
            System.out.print("静态代码块!-->");     
        }
 
        public static void test(){        
            { 
                 System.out.println("普通方法中的代码块!");         
            }     
         } 
}

//测试类 
public class TestClass {           
     /* 区别两次new静态与非静态代码块执行情况 */ 
    public static void main(String[] args) {         
           PuTong c1 = new PuTong();         
           c1.test();          
           PuTong c2 = new PuTong();         
           c2.test();     
     } 
}


一般情况下,如果有些代码必须在项目启动的时候就执行的时候,需要使用静态代码块,这种代码是主动执行的;需要在项目启动的时候就初始化,在不创建对象的情况下,其他程序来调用的时候,需要使用静态方法,这种代码是被动执行的.  


两者的区别就是:静态代码块是自动执行的; 静态方法是被调用的时候才执行的. 
作用:静态代码块可用来初始化一些项目最常用的变量或对象;静态方法可用作不创建对象也可能需要执行的代码.

在类中,可以将某一块代码声明为静态的,这样的程序块叫静态初始化段。静态代码块的一般形式如下:
static { 语句序列 }
静态代码块只能定义在类里面,它独立于任何方法,不能定义在方法里面。
静态代码块里面的变量都是局部变量,只在本块内有效。
静态代码块会在类被加载时自动执行,而无论加载者是JVM还是其他的类。
一个类中允许定义多个静态代码块,执行的顺序根据定义的顺序进行。
静态代码块只能访问类的静态成员,而不允许访问实例成员。 之所以不允许静态方法访问实例成员变量,是因为实例成员变量是属于某个对象的,而静态方法在执行时,并不一定存在对象。同样,因为实例方法可以访问实例成员变量,如果允许静态方法调用实例方法,将间接地允许它使用实例成员变量,所以它也不能调用实例方法。基于同样的道理,静态方法中也不能使用关键字this。




转载于:https://my.oschina.net/u/1446273/blog/201226

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值