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. Markdown编辑器为什么好用以及好用的markdown编辑器

    Markdown编辑器为什么好用以及好用的markdown编辑器 一.总结 一句话总结:Markdown 是一种简单的.轻量级的标记语法.用户可以使用诸如 * # 等简单的标记符号以最小的输入代价生成 ...

  2. SpringBoot与Dubbo整合-项目搭建

    本章节建立生产者和消费者来演示dubbo的demo 生产者:springboot-dubbo-provider 和 消费者:springboot-dubbo-consumer 工程配置详解 Apach ...

  3. 类数组对象arguments 和 数组对象

    arguments并不是一个真正的数组,而是一个“类似数组(array-like)”的对象: 就像下面的这段输出,就是典型的类数组对象: {0:12, 1:23} 一.类数组 VS 数组 相同点: 都 ...

  4. POJ 2391 Floyd+二分+拆点最大流

    题意: 思路: 先Floyd一遍两两点之间的最短路 二分答案 建图 跑Dinic 只要不像我一样作死#define int long long 估计都没啥事-- 我T到死辣--.. 最后才改过来-- ...

  5. Deep Networks : Overview

    Overview In the previous sections, you constructed a 3-layer neural network comprising an input, hid ...

  6. java好文章链接

    ❀Java内存分配全面浅析:http://blog.csdn.net/yangyuankp/article/details/7651251 ❀自定义控件进阶篇1:http://mp.weixin.qq ...

  7. cksum---检验文件CRC是否正确

  8. java byte中存大于0x7E的十六进制数

    在做一个Android app和arm板子交互的程序中,遇到一个问题,Java byte中无法直接存储大于0x7E的十六进制,但是C语言却可以. 出现这个状况的原因是:Java中是byte存储的是有符 ...

  9. theme- 工作原理

    首先看一下theme中的设置,代码如下 <?xml version="1.0" encoding="utf-8"?> <resources&g ...

  10. Android学习笔记进阶19之给图片加边框

    //设置颜色 public void setColour(int color){ co = color; } //设置边框宽度 public void setBorderWidth(int width ...