(转) Java 静态代码块和非静态代码块

参考:http://uule.iteye.com/blog/1558891

Java中的静态代码块是在虚拟机加载类的时候,就执行的,而且只执行一次。如果static代码块有多个,JVM将按照它们在类中出现的先后顺序依次执行它们,每个代码块只会被执行一次。

非静态代码块是在类new一个实例的时候执行,而且是每次new对象实例都会执行。

代码的执行顺序

  1. 主调类的静态代码块
  2. 对象父类的静态代码块
  3. 对象的静态代码块
  4. 对象父类的非静态代码块
  5. 对象父类的构造函数
  6. 对象的非静态代码块
  7. 对象的构造函数

示例代码

public class StaticBlockTest1 {

    //主调类的非静态代码块
    {
        System.out.println("StaticBlockTest1 not static block");
    }
    //主调类的静态代码块
    static {
        System.out.println("StaticBlockTest1 static block");
    }

    public StaticBlockTest1(){
        System.out.println("constructor StaticBlockTest1");
    }

    public static void main(String[] args) {
        Children children = new Children();
        children.getValue();
    }

}


class Parent{

    private String name;
    private int age;

    //父类无参构造方法
    public Parent(){
        System.out.println("Parent constructor method");
        {
            System.out.println("Parent constructor method--> not static block");
        }
    }
    //父类的非静态代码块
    {
        System.out.println("Parent not static block");
        name = "zhangsan";
        age = 50;
    }
    //父类静态代码块
    static {
        System.out.println("Parent static block");
    }

    //父类有参构造方法
    public Parent(String name, int age) {
        System.out.println("Parent constructor method");
        this.name = "lishi";
        this.age = 51;
    }

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    public int getAge() {
        return age;
    }

    public void setAge(int age) {
        this.age = age;
    }
}

class Children extends Parent{
    //子类静态代码块
    static {
        System.out.println("Children static block");
    }

    //子类非静态代码块
    {
        System.out.println("Children not static block");
    }

    //子类无参构造方法
    public Children(){
        System.out.println("Children constructor method");
    }


    public void getValue(){
        //this.setName("lisi");
        //this.setAge(51);
        System.out.println(this.getName() + this.getAge());
    }
}

输出结果

StaticBlockTest1 static block   //主调类的静态代码块
Parent static block             //父类的静态代码块
Children static block           //子类的静态代码块
Parent not static block         //父类的非静态代码块
Parent constructor method       //父类的构造函数
Parent constructor method--> not static block
Children not static block       //主调类的非静态代码块
Children constructor method     //主调类的构造函数
zhangsan50                      //主调main方法
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9

总结:

  1. 按照前面提到的顺序执行
  2. 子类定义无参构造方法,调用的父类也是无参构造方法

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

发表于

我来说两句

0 条评论
登录 后参与评论

相关文章

来自专栏武培轩的专栏

剑指Offer-把字符串转换成整数

package String; /** * 把字符串转换成整数 * 题目描述 * 将一个字符串转换成一个整数,要求不能使用字符串转换整数的库函数。 数值...

42430
来自专栏大闲人柴毛毛

剑指offer——面试题10输入一个十进制整数,统计其中二进制1的个数

/** * 题目:输入一个十进制整数,统计其中二进制1的个数 * @author 大闲人柴毛毛 */ public class CountBitOne {...

39240
来自专栏mathor

LeetCode164. 最大间距

 这道题用到了桶排序的思想,但是跟排序没啥关系,思路是这样的,数组中有n个元素,那么就构建n+1个桶,桶的属性有三个,最大值最小值以及是否为空。桶的下标从0...

14320
来自专栏desperate633

深入理解javascript中的继承机制 之 12种继承模式总结原型链法仅从原型继承临时构造器原型属性拷贝所有属性拷贝(浅拷贝)深拷贝原型继承法扩展与增强模式多重继承法寄生式继承借用构造函数:构造器于

之前我们介绍了多种javascript中的继承方式,最后我们开始总结概括这些继承方式,先将javascript中的继承分类,根据不同的条件,可以分成不同的类别。...

10720
来自专栏noteless

[五]基础数据类型之Short详解

50230
来自专栏游戏杂谈

AS3.0中类初始化的顺序

父类--静态变量 子类--静态变量 父类--变量 父类--构造器 子类--变量 子类--构造器

12240
来自专栏Linux驱动

23.C++- 继承的多种方式、显示调用父类构造函数、父子之间的同名函数、virtual虚函数  上章链接: 22.C++- 继承与组合,protected访问级别

继承方式 继承方式位于定义子类的”:”后面,比如: class Line : public Object //继承方式是public {...

34690
来自专栏Android开发指南

2 :基本语法

372110
来自专栏Python疯子

数据分析之numpy

ndarray概述 创建n维数组 接收的是列表类型,所有元素类型必须相同 shape表示各维度大小的元组 dtype表示数组数据类型对象

16110
来自专栏mathor

波兰表达式

24040

扫码关注云+社区

领取腾讯云代金券