static{}静态代码块与{}普通代码块之间的区别

本文详细介绍了Java中静态代码块与非静态代码块的相同点与不同点,包括它们的执行时机、执行次数及访问权限等。并通过具体示例展示了如何在实际编程中运用这些特性。

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

相同点:都是在JVM加载类时且在构造方法执行之前执行,在类中都可以定义多个,

    一般在代码块中对一些static变量进行赋值。

不同点:静态代码块在非静态代码块之前执行(静态代码块—>非静态代码块—>构造方法)

    静态代码块只在第一次new执行一次,之后不再执行,而非静态代码块在每new

    一次就执行一次。非静态代码块可在普通方法中定义(不过作用不大);而静态代码块不行。

例:

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

//测试类
publicclass TestClass {
   

    /**
    
* 区别两次new静态与非静态代码块执行情况
    
*/
   
publicstaticvoid main(String[] args) {
       
PuTong c1 = new PuTong();
       
c1.test();
       
        PuTong c2 = new PuTong();
       
c2.test();
    }
}

/*
运行输出结果是:
静态代码块!-->非静态代码块!-->默认构造方法!-->普通方法中的代码块!
非静态代码块!-->默认构造方法!-->普通方法中的代码块!
*/

 

 

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

 

两者的区别就是:静态代码块是自动执行的;

静态方法是被调用的时候才执行的.

 

作用:静态代码块可用来初始化一些项目最常用的变量或对象;静态方法可用作不创建对象也可能需要执行的代码.

 

 

3.7.3  静态代码块

在类中,可以将某一块代码声明为静态的,这样的程序块叫静态初始化段。静态代码块的一般形式如下:

static {
语句序列
}

静态代码块只能定义在类里面,它独立于任何方法,不能定义在方法里面。

静态代码块里面的变量都是局部变量,只在本块内有效。

静态代码块会在类被加载时自动执行,而无论加载者是JVM还是其他的类。

一个类中允许定义多个静态代码块,执行的顺序根据定义的顺序进行。

静态代码块只能访问类的静态成员,而不允许访问实例成员。

【例3.25】静态代码块运行示例1。

//-----------文件名staticBlock.java,程序编号3.38-----------------
public class staticBlock{
//定义一个普通的main()方法
public static void main(String args[]){
System.out.println("This is main method."); 
}
//定义一个静态代码块
static{
System.out.println("This is static block.");
int stVar = 0;   //这是一个局部变量,只在本块内有效
}
}

编译通过后,用java命令加载本程序,会得到如下输出:

This is static block.
This is main method.

从以上输出结果中可以看出,静态代码块甚至在main方法之前就被执行。在main()方法中可以完成的任务在静态代码块中都可以完成。但是二者在执行上仍然有一些区别,请看下例。

【例3.26】静态代码块和main()方法的区别。

这里仍然使用例3.25中的staticBlock类,然后新定义一个类来使用它。

//-----------文件名useStaticBlock.java,程序编号3.39-----------------
public class useStaticBolck{
public static void main(String args[]){
new staticBlock();  //创建一个staticBlock的对象
}
}

本例其实可以概括成一句话:静态方法只能访问静态成员,实例方法可以访问静态和实例成员。之所以不允许静态方法访问实例成员变量,是因为实例成员变量是属于某个对象的,而静态方法在执行时,并不一定存在对象。同样,因为实例方法可以访问实例成员变量,如果允许静态方法调用实例方法,将间接地允许它使用实例成员变量,所以它也不能调用实例方法。基于同样的道理,静态方法中也不能使用关键字this。

main()方法是一个典型的静态方法,它同样遵循一般静态方法的规则,所以它可以由系统在创建对象之前就调用。下面这个程序有个错误,请读者仔细查看。

public class hasError{
int insVar = 100;
public static void main(String args[]){
System.out.println("insVar = " + insVar);
}
}

本程序没有像以前的程序那样,在创建对象时使用一个变量来接收对象,因为这个程序在后面并不需要用到这个变量。程序的输出如下:

This is static block.

这一次,只执行了静态代码块,main()方法在这种情况下是不会被执行的。

最后来写一个复杂一点的静态代码块的例子,它综合体现了静态代码块的使用方法,请读者注意注释说明。

【例3.27】静态代码块使用示例2。

//-----------文件名staticBlock.java,程序编号3.40-----------------
public class staticBlock{
static int stMember = 100;    //定义静态成员变量
public static void main(String args[]){
System.out.println("This is main method.");
}
//第一个静态代码块
static{
System.out.println("This is first static block.");
stMember  = 200;      //访问静态成员变量
staticBlock oa = new staticBlock(); //创建对象
System.out.println("stMember = " + oa.stMember);
statFun();        //调用静态方法
}
//定义一个静态方法
static void statFun(){
System.out.println("This is a static method.");
}
//第二个静态代码块
static{
System.out.println("This is second static block.");
}
}

程序运行的结果如下:

This is first static block.
stMember = 200
This is a static method.
This is second static block.
This is main method.


 

静态代码块是Java中一种特殊的代码块,用`static`修饰。以下是关于静态代码块的详细介绍: ### 语法格式 在Java中,静态代码块的语法格式如下: ```java 【修饰符】 class 类 { static { // 静态代码块内容 } // 类的其他成员 } ``` 例如: ```java class Person { public static int total; static { total = 100; // 为total赋初值 } // 其它属性或方法声明 } ``` ### 执行特点 - **随类加载执行且仅执行一次**:静态代码块随着类的加载而加载,并且只执行一次。如在以下代码中,无论创建多少个`Test`类的对象,静态代码块只会执行一次: ```java class Test { static { System.out.println("我是静态代码块"); } public Test() { System.out.println("我是Test类的构造方法"); } } public class Main { public static void main(String[] args) { Test t1 = new Test(); Test t2 = new Test(); Test t3 = new Test(); } } ``` 运行结果中,“我是静态代码块”只会输出一次。 - **执行顺序优先**:静态代码块的执行要先于非静态代码块构造器。当类被加载时,会先执行静态代码块,然后才会进行其他操作。 ### 作用 - **初始化静态属性**:通常用于初始化`static`的属性。例如: ```java class Person { public static int total; static { total = 100; // 为total赋初值 } } ``` 在上述代码中,静态代码块静态变量`total`赋了初始值。 - **对类的声明进行初始化操作**:可以在静态代码块中对类的一些声明进行初始化操作,如加载驱动等。 ### 限制 - **不能对非静态属性初始化**:静态代码块不可以对非静态的属性进行初始化,即不可以调用非静态的属性方法。因为静态代码块在类加载时执行,此时可能还没有创建对象,而非静态属性方法是对象相关的。 - **不能存在于方法体中**:静态代码块不能存在任何方法体中。非静态普通方法需要通过实例化对象来调用,而静态代码块在类加载时就会执行;静态方法虽然在类加载时也加载了,但需要通过类名或者对象名才能访问,静态代码块是主动运行的,方法的调用机制不同 [^3]。 ### 多个静态代码块的执行顺序 若一个类中有多个静态代码块,那么会按照从上到下的顺序依次执行。例如: ```java class MultipleStaticBlocks { static { System.out.println("第一个静态代码块"); } static { System.out.println("第二个静态代码块"); } } ``` 运行时会先输出“第一个静态代码块”,再输出“第二个静态代码块”。
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值