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

    https://www.cnblogs.com/lukelook/p/11183155.html

    先看一个例子:

    复制代码
    //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.");
    }
    }
    复制代码
    诸位正值青春年少,一定恣情放纵,贪恋香艳梅施之情,喜欢风流雅韵之事,洒脱木拘。然而诸位可知,草上露一碰即落,竹上霜一触即溶,此种风情难于长久。
  • 相关阅读:
    PHP与Web页面的交互
    PHP数组和数据结构(下)未完。。。。
    PHP数组和数据结构(上)
    网络
    单列模式(饿汉模式和懒汉模式)
    C++动态内存管理
    基础I/O
    进程程序替换(自主实现shell)
    进程控制
    调研task_struct结构体
  • 原文地址:https://www.cnblogs.com/shilipojianshen/p/12796315.html
Copyright © 2011-2022 走看看