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. PHP CLI模式下的多进程应用分析

    PHP在非常多时候不适合做常驻的SHELL进程, 他没有专门的gc例程, 也没有有效的内存管理途径. 所以假设用PHP做常驻SHELL, 你会常常被内存耗尽导致abort而unhappy 并且, 假设 ...

  2. Java 关于运算结果

    今天发现一个自己的一个知识误区 原来有些自己以为会发生异常的运算,并没有异常发生,只要运算符两端存在至少一个浮点数 比如: public class Demo { /** * @param args ...

  3. 关于jquery的事件命名空间

    在多人协作的前端开发中,或许会遇到一个问题:几个开发人员都给一个元素添加了同样的事件,但是又有开发人员想要解除掉元素身上的某个事件效果,这时候操作起来就有些麻烦,需要用到jquery给我们提供的事件命 ...

  4. Impala的优缺点

    不多说,上干货! 优点: 支持SQL查询,快速查询大数据. 可以对已有数据进行查询,减少数据的加载,转换. 多种存储格式可以选择(Parquet, Text, Avro, RCFile, Sequee ...

  5. 2019.05.08 《Linux驱动开发入门与实战》

    第六章:字符设备 申请设备号---注册设备 1.字符设备的框架: 2.结构体,struct cdev: 3.字符设备的组成: 4.例子: 5.申请和释放设备号: 设备号和设备节点是什么关系.? 设备驱 ...

  6. 【Pycharm】【HTML/jQuery】代码换行问题

    问题:从网上下载jQuery文件后发现代码太长,不利于阅读:Pycharm没有预先设置好js文件的自动换行设置 问题 解决办法 解决后

  7. hdu5400Arithmetic Sequence

    //一个序列,两个公差d1,d2 //问有多少个区间使得这个区间存在一个点,它的左边是公差为d1的序列 //它的右边是公差为d2的序列 //直接存入每一个点向左和向右延伸的公差长度,乘一下即可 //还 ...

  8. 8lession-基础类型转化

    Python数据类型转换 有时候,我们需要对数据内置的类型进行转换,数据类型的转换,你只需要将数据类型作为函数名即可. 以下几个内置的函数可以执行数据类型之间的转换.这些函数返回一个新的对象,表示转换 ...

  9. 71.sscanf数据挖掘

    数据挖掘 sscanf(str, "%d %s %s %d %d %s %s %s", &ph[i].id, ph[i].name, ph[i].sex, &ph[ ...

  10. spring定时器完整

    介绍:在开发中,我们经常需要一些周期性就进行某一项操作.这时候我们就要去设置个定时器,Java中最方便.最高效的实现方式是用java.util.Timer工具类,再通过调度java.util.Time ...