一个类中的数据初始化顺序是面试官非常喜欢出的面试题之一,本文用一个实例来介绍java中子类、父类中静态代码块、字段,非静态代码块、字段以及构造函数的执行顺序和次数。

一、包结构

Cat继承Animal

Runner里包含main函数,程序入口

Sing类主要用来打印执行顺序的序列号

二、代码

public class Animal {

        Sing s1=new Sing(1,"animal\tnot static field");
        static Sing s2=new Sing(2,"animal\tstatic field");
        static Sing s3;
        Sing s4;
        Sing s5;

        static{
            s3=new Sing(3,"animal\tstatic code area");
        }

        {

            s4=new Sing(4,"animal\tnot static code area");
        }

        Animal(){
            s5=new Sing(5,"animal\tconstructor");
        }
    }
public class Cat extends Animal {
    Sing s1=new Sing(1,"cat\t\tnot static field");
    static Sing s2=new Sing(2,"cat\t\tstatic field");
    static Sing s3;
    Sing s4;
    Sing s5;

    static{
        s3=new Sing(3,"cat\t\tstatic code area");
    }

    {

        s4=new Sing(4,"cat\t\tnot static code area");
    }

    Cat(){
        s5=new Sing(5,"cat\t\tconstructor");
    }
}
public class Sing {
    Sing(int mark,String flag){
        System.out.println(mark+" "+flag);
    }
}
public class Runner {

    public static void main(String[] args) {
        System.out.println("+++++++++++++++++++++first+++++++++++++++++++++++++++++");
        new Cat();
        System.out.println("+++++++++++++++++++++second++++++++++++++++++++++++++++");
        new Cat();
    }
}

三、执行结果

+++++++++++++++++++++first+++++++++++++++++++++++++++++
2 animal    static field
3 animal    static code area
2 cat        static field
3 cat        static code area
1 animal    not static field
4 animal    not static code area
5 animal    constructor
1 cat        not static field
4 cat        not static code area
5 cat        constructor
+++++++++++++++++++++second++++++++++++++++++++++++++++
1 animal    not static field
4 animal    not static code area
5 animal    constructor
1 cat        not static field
4 cat        not static code area
5 cat        constructor

四、总结

初始化顺序:父类静态字段-》父类静态代码块-》子类静态字段-》子类静态代码块-》父类非静态字段-》父类非静态代码块-》父类构造-》子类非静态字段-》子类非静态代码块-》子类构造

遵循以下原则:

1、静态>非静态

2、父类>子类

3、字段>代码块>构造函数

4、静态字段、静态代码块在程序生命周期只初始化一次

java 子类、父类中静态代码块、字段,非静态代码块、字段以及构造函数的初始化顺序和次数的更多相关文章

  1. java中静态代码块,非静态代码块,构造函数

    关于静态代码块 静态代码块的写法: static { System.out.println("我是静态代码块"); } 静态代码块的特点: 1.执行优先级高于非静态的初始化块,它会 ...

  2. JAVA程序执行顺序(静态代码块》非静态代码块》静态方法》构造函数)

    总结:静态代码块总是最先执行. 非静态代码块跟非静态方法一样,跟对象有关.只不过非静态代码块在构造函数之前执行. 父类非静态代码块.构造函数执行完毕后(相当于父类对象初始化完成), 才开始执行子类的非 ...

  3. Java 中的静态嵌套类和非静态嵌套类

    Java 中的静态嵌套类和非静态嵌套类 术语:嵌套类分为两类:静态嵌套类和非静态嵌套类.声明 static 的嵌套类称为静态嵌套类,非静态嵌套类也称为内部类. class OuterClass { p ...

  4. ERROR无法从静态上下文中引用非静态变量

    ERROR无法从静态上下文中引用非静态变量 2012-06-16 20:58:52 分类: Java 什么是“static”? 学习过java.C++或C的人都应该认识这个关键字.用这个关键字修饰的变 ...

  5. Java子父类间静态代码块、非静态代码块、构造方法的执行顺序

    子类A继承父类B,A a=new A(); 正确的执行顺序是:父类B静态代码块->子类A静态代码块->父类B非静态代码块->父类B构造函数->子类A非静态代码块->子类A ...

  6. Java中静态变量、静态代码块、非静态代码块以及静态方法的加载顺序

    在研究单例设计模式的时候,用到了静态变量和静态方法的内容,出于兴趣,这里简单了解一下这四个模块在类初始化的时候的加载顺序. 经过研究发现,它们的加载顺序为: 1.非静态代码块 2.静态变量或者静态代码 ...

  7. 浅谈Java中静态代码块和非静态代码块

    静态代码块: static{} 执行优先级高于非静态的初始化块,它会在类初始化(类初始化这个问题改天再详细讨论)的时候执行一次,执行完成便销毁,它仅能初始化类变量,即static修饰的数据成员. 非静 ...

  8. Java:多线程,线程同步,synchronized关键字的用法(同步代码块、非静态同步方法、静态同步方法)

    关于线程的同步,可以使用synchronized关键字,或者是使用JDK 5中提供的java.util.concurrent.lock包中的Lock对象.本文探讨synchronized关键字. sy ...

  9. Java静态代码块与非静态代码块

    静态代码块,格式是 static{ },随着类的加载而加载,且只执行一次. 在程序中,执行的优先级最高. 非静态代码块,格式是{ },在创建对象的时候运行(即new一个对象的时候),每创建一次对象就执 ...

随机推荐

  1. J2EE

    随笔分类 - J2EE   关于SpringMVC Json使用 摘要: 很简单的一个东西,这里就不做过多介绍了,写一个小Demo,随手记录下.首先,在搭好SpringMVC工程环境之后,如果想用Sp ...

  2. C#在outlook里创建一封邮件到草稿箱

    原文:C#在outlook里创建一封邮件到草稿箱 1.引用Microsoft.Office.Interop.Outlook.dll 2.  实现代码 public static int SendToD ...

  3. 怎样使用万用表来测试板子上的TX和RX引脚

    最近在看openwrt时看到的一个方法,直接看下面写的: 文章来自:http://wiki.openwrt.org/doc/hardware/port.serial 经实际测试时发现,将万用表的负表笔 ...

  4. serialVersionUID行动

    ORIGINAL:未知 Java断类的serialVersionUID来验证版本号一致性的.在进行反序列化时,JVM会把传来的字节流中的serialVersionUID与本地对应实体(类)的seria ...

  5. 安卓推送——个推服务端api使用误区

    首先你需要在个推开放着平台上注册你的应用,以及获得以下几个必要的值APPID |APPKEY | MASTERSECRET,本文假设你已经完成上述步骤以及完成客户端SDK的集成. 原理 个推服务端ap ...

  6. Android中的dp,px以及wrap_content的实际展示效果

    因为一个效果中的图片设置了wrap_content的属性,但在720dp跟540dp上面显示不一致使老大非常恼火.跟他讲也讲不明白.于是乎让我们彼此测试来探个究竟.首先测试的是个图片: 它的物理像素是 ...

  7. ASP.NET MVC应用程序更新相关数据

    为ASP.NET MVC应用程序更新相关数据 这是微软官方教程Getting Started with Entity Framework 6 Code First using MVC 5 系列的翻译, ...

  8. iOS基础 - UITableViewController

    1. 继承UITableViewController默认会设置数据源和代理,并且会自动遵守数据源和代理协议,并且self.tableView 相当于 self.view 2.更换控制器时,注意把sto ...

  9. Windows 7/8 64位下安装64位Apache 2.4.7

    准备软件: VC11 运行库 64位的apache版本 传送门:http://www.apachelounge.com/download/ 安装步骤: 修改httpd.conf配置文件 37行: Se ...

  10. MongoDB:锁机制

    --1 MongoDB 使用的锁 MongoDB 使用的是“readers-writer”锁, 可以支持并发但有很大的局限性,当一个读锁存在,许多读操作可以使用这把锁,然而, 当一个写锁的存在,一个单 ...