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


 

今天动力节点java培训机构小编为大家介绍“static{}静态代码块与{}普通代码块之间的区别 ”,希望通过此文大家能够熟悉static{}静态代码块与{}普通代码块之间的区别 ,下面就随小编一起来了解一下static{}静态代码块与{}普通代码块之间的区别是什么?


timg (3).jpg


先看一个例子:


//class A 

package com.my.test;


class A {


    static {

        System.out.println("A1:父类静态代码区域");

    }


    {

        System.out.println("A2:父类非静态代码区域");

    }


    public A() {

        System.out.println("A3:父类构造器");

    }

}


//class B


package com.my.test;


public class B extends A {


    static {

        System.out.println("B1:子类静态代码区域");

    }


    {

        System.out.println("B2:子类非静态代码区域");

    }


    public B() {

        System.out.println("B3:子类构造器");

    }

}


// 测试类

package com.my.test;


public class Test {

    public static void main(String[] args) {

        B b1 = new B();

        System.out.println("====");

        B b2 = new B();

    }

}


  运行结果:


  A1:父类静态代码区域


  B1:子类静态代码区域


  A2:父类非静态代码区域


  A3:父类构造器


  B2:子类非静态代码区域


  B3:子类构造器


  ====


  A2:父类非静态代码区域


  A3:父类构造器


  B2:子类非静态代码区域


  B3:子类构造器

  

  区别:


  静态代码块,在虚拟机加载类的时候就会加载执行,而且只执行一次;


  非静态代码块,在创建对象的时候(即new一个对象的时候)执行,每次创建对象都会执行一次


  一个程序可以有多个静态非静态代码区域。



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


  相同点:


(1)都是在JVM加载类时且在构造方法执行之前执行,在类中都可以定义多个,


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


  (3)另外static块中只能使用static修饰的属性。


  (4)程序中的static{}块只是为了加载properties文件信息,这个加载只会被加载一次。


  不同点:


(1)静态代码块在非静态代码块之前执行(静态代码块—>非静态代码块—>构造方法)。


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


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


      例:


//普通类

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();

    }

}


/*

运行输出结果是:

静态代码块!-->非静态代码块!-->默认构造方法!-->普通方法中的代码块!

非静态代码块!-->默认构造方法!-->普通方法中的代码块!

*/


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


  静态代码块和静态方法的区别


静态代码块是自动执行的;


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


  静态代码块和静态方法的作用:


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



  1、静态代码块


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


static {

  语句序列

}


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


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


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


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


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


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


//定义一个普通的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()方法中可以完成的任务在静态代码块中都可以完成。但是二者在执行上仍然有一些区别,请看下例。



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


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


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】静态代码块使用示例2:


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.");

}

}


timg.jpg


以上就是动力节点java培训机构小编介绍的“static{}静态代码块与{}普通代码块之间的区别 ”的内容,希望对大家有帮助,更多java最新资讯请继续关注动力节点java培训机构官网,每天会有精彩内容分享与你。


相关免费视频教程推荐


java零基础教程下载——static修饰代码块:http://www.bjpowernode.com/xiazai/2617.html


上一篇:告诉你在java中为什么要慎重使用继承
下一篇:深入理解java中Static关键字修饰符

开班信息