Java中关于static语句块的理解

一、static块会在类被加载的时候执行且仅会被执行一次,一般用来初始化静态变量和调用静态方法。

实例一

public class A{
String name;
public A(String name){
this.name = name;
} //静态块
static{
System.out.println("static语句块执行");
} public static void main(String args[]){
A a = new A("张三");
A b = new A("李四");
A c = new A("王五");
}
}

程序运行后只输出了一条“static语句块执行”语句,因为在Java虚拟机的生命周期中一个类只被加载一次,又因为静态块是伴随A类加载执行的,所以不管构建多少次A类的实例对象,静态块都会被执行且只执行一次。


实例二

class A{
public A(){
System.out.println("A在构造体内");
}
{System.out.println("A在普通块内");}
static{
System.out.println("A在static静态块内");
}
}

public class B extends A{
public B(){
System.out.println("B在构造体内");
}
{System.out.println("B在普通块内");}
static{
System.out.println("B在static静态块内");
} public static void main(String args[]){
new B();
}
}

输出结果如下:

A在static静态块内
B在static静态块内
A在普通块内
A在构造体内
B在普通块内
B在构造体内

二、Java 静态语句块、语句块、构造函数的执行顺序

class Parent{    
  static String name = "hello";    
   
  {    
      System.out.println("3 parent block");    
  }    
  static {    
      System.out.println("1 parent static block");    
  }    
   
  public Parent(){    
      System.out.println("4 parent constructor");    
  }    
}    
   
class Child extends Parent{    
  static String childName = "hello";    
   
  {    
      System.out.println("5 child block");    
  }    
  static {    
      System.out.println("2 child static block");    
  }  
   
  public Child(){    
      System.out.println("6 child constructor");    
  }    
}    
   
public class StaticIniBlockOrderTest {    
   
  public static void main(String[] args) {    
      new Child();//语句(*)    
  }    
}    

结果:

1 parent static block 2 child static block 3 parent block 4 parent constructor 5 child block 6 child constructor

执行 顺序:

1)执行父类静态的内容,父类静态的内容执行完毕后,接着去执行子类的静态的内容;

2)当子类的静态内容执行完毕之后,再去看父类有没有非静态代码块,如果有就执行父类的非静态代码块,父类的非静态代码块执行完毕,接着执行父类的构 造方法;

3)父类的构造方法执行完毕之后,它接着去看子类有没有非静态代码块,如果有就执行子类的非静态代码块。子类的非静态代码块执行完毕再去执行子类的构造方法。

总之一句话,静态代码块内容先执行,接着执行父类非静态代码块和构造方法,然后执行子类非静态代码块和构造方法。 而且子类的构造方法,不管这个构造方法带不带参数,默认的它都会先去寻找父类的不带参数的构造方法。如果父类没有不带参数的构造方法,那么子类必须用supper关键子来调用父类带参数的构造方法,否则编译不能通过。

Java中关于static语句块的理解的更多相关文章

  1. java中的static代码块为什么只执行一次

    原因在最后,这是其中的一个小例子. 如: SessionFactory负责保存和使用所有配置信息,消耗内存资源非常大 所以一个web项目要保证只创建一个SessionFactory 那么在使用hibe ...

  2. 转 java中static{}语句块详解

    原文地址:http://blog.csdn.net/lubiaopan/article/details/4802430     感谢原作者! static{}(即static块),会在类被加载的时候执 ...

  3. java中static{}语句块详解

    static{}(即static块),会在类被加载的时候执行且仅会被执行一次,一般用来初始化静态变量和调用静态方法,下面我们详细的讨论一下该语句块的特性及应用. 一.在程序的一次执行过程中,stati ...

  4. 关于java的static语句块

    声明:转载请注明出处 static{}(即static块),会在类被加载的时候执行且仅会被执行一次,一般用来初始化静态变量和调用静态方法,下面我们详细的讨论一下该语句块的特性及应用. 一.在程序的一次 ...

  5. Java static{}语句块详解

    [转自] http://blog.csdn.net/lubiaopan/article/details/4802430 static{}(即static块),会在类被加载的时候执行且仅会被执行一次,一 ...

  6. static 语句块

    static{}(即static块),会在类被加载的时候执行且仅会被执行一次,一般用来初始化静态变量和调用静态方法,下面我们详细的讨论一下该语句块的特性及应用. 一.在程序的一次执行过程中,stati ...

  7. Java 中的 static 使用之静态初始化块

    Java 中可以通过初始化块进行数据赋值.如: 在类的声明中,可以包含多个初始化块,当创建类的实例时,就会依次执行这些代码块.如果使用 static 修饰初始化块,就称为静态初始化块. 需要特别注意: ...

  8. (转)Java中的static关键字解析

    转载: http://www.cnblogs.com/dolphin0520/p/3799052.html 一.static关键字的用途 在<Java编程思想>P86页有这样一段话: &q ...

  9. Java中的static关键字解析

    Java中的static关键字解析 static关键字是很多朋友在编写代码和阅读代码时碰到的比较难以理解的一个关键字,也是各大公司的面试官喜欢在面试时问到的知识点之一.下面就先讲述一下static关键 ...

随机推荐

  1. SQL解析器的性能測试

    对同一个sql语句,使用3种解析器解析出ast语法树(这是编译原理上的说法,在sql解析式可能就是解析器自己定义的statement类型).运行100万次的时间对照. package demo.tes ...

  2. php 内置的 html 格式化/美化tidy函数 -- 让你的HTML更美观

    php 内置的 html 格式化/美化tidy函数 https://github.com/htacg/tidy-html5 # HTML 格式化 function beautify_html($htm ...

  3. linux 命令之 tar

    作用 tar命令是Unix/Linux系统中备份文件的可靠方法.差点儿能够工作于不论什么环境中,它的使用权限是全部用户. 语法: tar [主选项+辅选项] 文件或文件夹 主选项: c 创建新的归档文 ...

  4. HDU 4010 Query on The Trees (动态树)(Link-Cut-Tree)

    题目链接: http://acm.hdu.edu.cn/showproblem.php?pid=4010 题意; 先给你一棵树,有 \(4\) 种操作: 1.如果 \(x\) 和 \(y\) 不在同一 ...

  5. Linux 常用解压缩归档命令

    linux 常见压缩.归档工具 创建压缩工具 压缩工具 后缀 描述 compress/uncompress .Z 早期工具,现在不常见了 gzip/gunzip .gz 进几年比较火的工具 bzip2 ...

  6. PYTHON学习第四天课后总结:

    第三天学习课后总结: 今日重点: 流程控制 1,if 条件判断语句 2,while 循环 3,for 循环 一,if +条件判断语句: 1>   if+条件判断表达式: 子代码1 子代码2 子代 ...

  7. 异步调用WCF的方法需要小心的地方

    直接使用下面的代码,由于client对象占用的资源没有被释放,会导致内存泄露GetSimServiceReference.GetSimServiceClient client = new GetSim ...

  8. vue踩坑记-在项目中安装依赖模块npm install报错

    在维护别人的项目的时候,在项目文件夹中安装npm install模块的时候,报错如下: npm ERR! path D:\ShopApp\node_modules\fsevents\node_modu ...

  9. 洛谷 P4779【模板】单源最短路径(标准版)

    洛谷 P4779[模板]单源最短路径(标准版) 题目背景 2018 年 7 月 19 日,某位同学在 NOI Day 1 T1 归程 一题里非常熟练地使用了一个广为人知的算法求最短路. 然后呢? 10 ...

  10. 洛谷 P1054 等价表达式

    洛谷 P1054 等价表达式 题目描述 明明进了中学之后,学到了代数表达式.有一天,他碰到一个很麻烦的选择题.这个题目的题干中首先给出了一个代数表达式,然后列出了若干选项,每个选项也是一个代数表达式, ...