zoukankan      html  css  js  c++  java
  • static{}静态代码块与{}普通代码块之间的区别

    先看一个例子:

    //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{}(静态代码块)与{}(非静态代码块)的异同点

    转载地址:http://blog.csdn.net/aledavvv/article/details/16920743

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

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

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

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

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

        静态代码块只在第一次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.");
    }
    }

     

  • 相关阅读:
    Mac上的USB存储设备使用痕迹在新版操作系统有所变化
    Beware of the encrypted VM
    A barrier for Mobile Forensics
    Second Space could let suspect play two different roles easily
    Take advantage of Checkra1n to Jailbreak iDevice for App analysis
    Find out "Who" and "Where"
    Where is the clone one and how to extract it?
    Downgrade extraction on phones running Android 7/8/9
    高版本安卓手机的取证未来
    How to extract WeChat chat messages from a smartphone running Android 7.x or above
  • 原文地址:https://www.cnblogs.com/lukelook/p/11183155.html
Copyright © 2011-2022 走看看