java 子类、父类中静态代码块、字段,非静态代码块、字段以及构造函数的初始化顺序和次数
一个类中的数据初始化顺序是面试官非常喜欢出的面试题之一,本文用一个实例来介绍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 子类、父类中静态代码块、字段,非静态代码块、字段以及构造函数的初始化顺序和次数的更多相关文章
- java中静态代码块,非静态代码块,构造函数
关于静态代码块 静态代码块的写法: static { System.out.println("我是静态代码块"); } 静态代码块的特点: 1.执行优先级高于非静态的初始化块,它会 ...
- JAVA程序执行顺序(静态代码块》非静态代码块》静态方法》构造函数)
总结:静态代码块总是最先执行. 非静态代码块跟非静态方法一样,跟对象有关.只不过非静态代码块在构造函数之前执行. 父类非静态代码块.构造函数执行完毕后(相当于父类对象初始化完成), 才开始执行子类的非 ...
- Java 中的静态嵌套类和非静态嵌套类
Java 中的静态嵌套类和非静态嵌套类 术语:嵌套类分为两类:静态嵌套类和非静态嵌套类.声明 static 的嵌套类称为静态嵌套类,非静态嵌套类也称为内部类. class OuterClass { p ...
- ERROR无法从静态上下文中引用非静态变量
ERROR无法从静态上下文中引用非静态变量 2012-06-16 20:58:52 分类: Java 什么是“static”? 学习过java.C++或C的人都应该认识这个关键字.用这个关键字修饰的变 ...
- Java子父类间静态代码块、非静态代码块、构造方法的执行顺序
子类A继承父类B,A a=new A(); 正确的执行顺序是:父类B静态代码块->子类A静态代码块->父类B非静态代码块->父类B构造函数->子类A非静态代码块->子类A ...
- Java中静态变量、静态代码块、非静态代码块以及静态方法的加载顺序
在研究单例设计模式的时候,用到了静态变量和静态方法的内容,出于兴趣,这里简单了解一下这四个模块在类初始化的时候的加载顺序. 经过研究发现,它们的加载顺序为: 1.非静态代码块 2.静态变量或者静态代码 ...
- 浅谈Java中静态代码块和非静态代码块
静态代码块: static{} 执行优先级高于非静态的初始化块,它会在类初始化(类初始化这个问题改天再详细讨论)的时候执行一次,执行完成便销毁,它仅能初始化类变量,即static修饰的数据成员. 非静 ...
- Java:多线程,线程同步,synchronized关键字的用法(同步代码块、非静态同步方法、静态同步方法)
关于线程的同步,可以使用synchronized关键字,或者是使用JDK 5中提供的java.util.concurrent.lock包中的Lock对象.本文探讨synchronized关键字. sy ...
- Java静态代码块与非静态代码块
静态代码块,格式是 static{ },随着类的加载而加载,且只执行一次. 在程序中,执行的优先级最高. 非静态代码块,格式是{ },在创建对象的时候运行(即new一个对象的时候),每创建一次对象就执 ...
随机推荐
- 单元测试之Qunit
单元测试之Qunit 前言 因为公司开发了一套javascript SDK需要测试,在网上找了很久,找到了JQuery团队开发的QUnit,和基于JUnit的JsUnit,还有一些还没有看,先讲讲QU ...
- sudo找不到npm的解决办法及及使用cnpm加速[已解决]
sudo ln -s /usr/local/bin/node /usr/bin/node sudo ln -s /usr/local/lib/node /usr/lib/node sudo ln -s ...
- object 插入元素,插入HTML页面
object标签用于定义一个嵌入的对象,包括:图像.音频.Java applets.ActiveX.PDF以及Flash.该标签允许您规定插入HTML文档中的对象的数据和参数,以及可用来显示和操作数据 ...
- mysql基础之基本数据类型
原文:mysql基础之基本数据类型 列类型学习 mysql三大列类型 整型 Tinyint/ smallint/ mediumint/int/ bigint(M) unsigned zerofill ...
- 解决nexus下载maven索引的问题
解决nexus下载maven索引的问题 (2011-10-12 17:48:46) 转载▼ 标签: it 分类: java 转自 http://www.colorfuldays.org/program ...
- 关于如何惟一地标识一台Android设备的综合性讨论
想必大家在开发Android项目的时候,多多少少会遇到“如何惟一地标识一台Android设备”等类似的问题.不只是以前,即使是现在乃至可以预见的将来,这个问题都将一直存在. 如果大家使用搜索工具搜索的 ...
- Eclipse编辑器样式修改
很多的开发工具都可以更改主题样式,但eclipse作为一款影响力巨大的开源开发工具,却没有自带更改样式的功能,这多少令人有点小遗憾.Eclipse 4之后,Eclipse使用者呼声高涨,就有人开始做起 ...
- DHTML【3】--HTML
从这一节开始我们就开始介绍HTML的标签了,首先我们来介绍Form标签. Form标签也称Form表单,From是与服务器交互最重要的标签,此标签必须做到随手就写,写完就正常运行的地步. 那么什么是F ...
- Confluence, JIRA, Fisheye
[tools]迁移Confluence, JIRA, Fisheye [背景] 原先的Confluence, JIRA, Fisheye都部署在一台服务器(192.168.200.203)上,导致 ...
- ACE编译运行错误解决
使用VS2010编译运行ACE版本号为6.0.1 按照网上步骤添加config.h,在ACE_wrappers/ace目录下 ,新建 config.h 文件加入以下内容: #include " ...