先看一个例子:

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

static{}静态代码块与{}普通代码块之间的区别的更多相关文章

  1. SQL语句、PL/SQL块和SQL*Plus命令之间的区别

    SQL语句.PL/SQL块和SQL*Plus命令之间的区别   原文链接:https://blog.csdn.net/liuzhushiqiang/article/details/12320941 在 ...

  2. 静态(static)代码块、构造代码块、构造函数、父类子类执行顺序

    静态代码块:static修饰的代码块. 在类加载-初始化的时候进行,主要目的是给变量赋予初始值 构造代码块:直接在类中定义且没有加static关键字的代码块称为构造代码块. java会把构造代码块放到 ...

  3. -1-2 java 面向对象基本概念 封装继承多态 变量 this super static 静态变量 匿名对象 值传递 初始化过程 代码块 final关键字 抽象类 接口 区别 多态 包 访问权限 内部类 匿名内部类 == 与 equal

    java是纯粹的面向对象的语言 也就是万事万物皆是对象 程序是对象的集合,他们通过发送消息来相互通信 每个对象都有自己的由其他的对象所构建的存储,也就是对象可以包含对象 每个对象都有它的类型  也就是 ...

  4. Java之static静态代码块

    Java之static静态代码块 构造代码块 使用{}包裹的代码区域,这里的代码区域特指位于class{}下面的而不是存在于其他type method(){}这类函数下面的代码区域 public cl ...

  5. java中静态代码块的用法 static用法详解和static静态导入

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

  6. Java static 静态代码块、代码块

    简述 static{} 静态代码块,加载类之前执行 {} 代码块,每次new的时候都会被执行 示例 类: public class Student { int age; String name; bo ...

  7. Java-静态关键字Static&静态代码块

    静态成员变量:(static修饰变量) 如果一个成员变量使用了static关键字,那么这个变量不再属于对象自己,而是属于所在的类.多个对象共享同一份数据. 静态方法:(static修饰方法) 一旦使用 ...

  8. 类(静态)变量和类(静态)static方法以及main方法、代码块,final方法的使用,单例设计模式

    类的加载:时间 1.创建对象实例(new 一个新对象时) 2.创建子类对象实例,父类也会被加载 3.使用类的静态成员时(静态属性,静态方法) 一.static 静态变量:类变量,静态属性(会被该类的所 ...

  9. About 静态代码块,普通代码块,同步代码块,构造代码块和构造函数的纳闷

    构造函数用于给对象进行初始化,是给与之对应的对象进行初始化,它具有针对性,函数中的一种.特点:1:该函数的名称和所在类的名称相同.2:不需要定义返回值类型.3:该函数没有具体的返回值.记住:所有对象创 ...

随机推荐

  1. strace调试跟踪程序运行状态

    查看进程调用和执行状态  :   strace  -f -F  -o debug.log  -p   PID(某个进程ID) 参考资料: http://www.itshouce.com.cn/linu ...

  2. failOnMissingWebXml

    使用maven创建项目时有时在pom.xml的war处出现failOnMissingWebXml的错误,根据错误提示的原因可以知道项目是web项目,打包时打成war包. 如果项目里没有web.xml, ...

  3. delphi7 clientdataset 详解

    delphi Midas SQLServer的自增字段的处理1.新增时,表中有自增字段,但是不希望用Refresh,直接ApplyUpdates直接看见自增字段的值在DataSetProvider.A ...

  4. c盘瘦身、windows解除上网限速、贴膜注意事项

    1.c盘瘦身 1.1.https://zhidao.baidu.com/question/2057622451987202467.html 1.2.把C盘的swap空间换到D盘 2.windows解除 ...

  5. swift 第十三课 GCD 的介绍和使用

    手头的项目中基本没有用到这个,但是还是要探索下.毕竟好多的地方要用这个,而且现在手机和电脑等电子设备都是多核心的,这样就成就了多线程带来更加优越的用户体验. 先记录下,自己看到的两个不错的连接: ht ...

  6. jenkins:执行远程shell脚本时,脚本没有生效

    问题: jenkins远程部署一台机器时,jenkins构建显示成功,但是查看服务日志却没有真正执行的sh run.sh脚本,导致服务并没有启动 解决: 只需要在命令最上方加上source /etc/ ...

  7. git clone、 remote、fetch、pull、push、remote

    git clone命令笔记 作用:远程克隆版本库 1. 克隆版本库 git clone <版本库的网址> git clone zoran@192.168.2.167:/data/gitda ...

  8. PJzhang:ms17-010永恒之蓝漏洞在windows 2008R2中的复现

    猫宁!!! 参考: https://www.anquanke.com/post/id/86245 https://xz.aliyun.com/t/2536 https://www.cnblogs.co ...

  9. python3 安装pip提示没有distutils.util模块错误的解决

    Python3 安装pip 提示ModuleNotFoundError: No module named 'distutils.util'   环境ubutun14,python版本是python3. ...

  10. fastclick.js

    <script src="//cdn.bootcss.com/fastclick/1.0.6/fastclick.js"></script> //<s ...