JAVA程序执行顺序(静态代码块》非静态代码块》静态方法》构造函数)
总结:静态代码块总是最先执行。
非静态代码块跟非静态方法一样,跟对象有关。只不过非静态代码块在构造函数之前执行。
父类非静态代码块、构造函数执行完毕后(相当于父类对象初始化完成), 才开始执行子类的非静态代码块和构造函数。
================================================================================
相同点:都是在JVM加载类时且在构造方法执行之前执行,在类中都可以定义多个,
一般在代码块中对一些static变量进行赋值。
不同点:静态代码块在非静态代码块之前执行
(静态代码块—>非静态代码块—>构造方法)。
静态代码块只在第一次被类加载器加载时执行一次,之后不再执行,而非静态代码块在每new一次就执行一次。非静态代码块可在普通方法中定义(不过作用不大);而静态代码块不行。
JVM加载类时会执行这些静态的代码块,如果static代码块有多个,JVM将按照它们在类中出现的先后顺序依次执行它们,每个代码块只会被执行一次。
例子一:
- public class PuTong {
- public PuTong(){
- System.out.print("默认构造方法!-->");
- }
- //非静态代码块
- {
- System.out.print("非静态代码块!-->");
- }
- //静态代码块
- static{
- System.out.print("静态代码块!-->");
- }
- public static void test(){
- {
- System.out.println("普通方法中的代码块!");
- }
- }
- }
- //测试类
- public class TestClass {
- /**
- * 区别两次new静态与非静态代码块执行情况
- */
- public static void main(String[] args) {
- PuTong c1 = new PuTong();
- c1.test();
- PuTong c2 = new PuTong();
- c2.test();
- }
- }
- /*
- 运行输出结果是:
- 静态代码块!-->非静态代码块!-->默认构造方法!-->普通方法中的代码块!
- 非静态代码块!-->默认构造方法!-->普通方法中的代码块!
- */
有两个要点:
1、父类、子类非静态代码块何时初始化?
2、父类调用重写方法时,到底执行的是哪个方法?
例子二:
- package tags;
- public class Child extends Father{
- static {
- System.out.println("child-->static");
- }
- private int n = 20;
- {
- System.out.println("Child Non-Static");
- n = 30;
- }
- public int x = 200;
- public Child() {
- this("The other constructor");
- System.out.println("child constructor body: " + n);
- }
- public Child(String s) {
- System.out.println(s);
- }
- public void age() {
- System.out.println("age=" + n);
- }
- public void printX() {
- System.out.println("x=" + x);
- }
- public static void main(String[] args) {
- new Child().printX();
- }
- }
- class Father {
- static {
- //System.out.println("n+"+n);
- //当n定义在下面时,会提示Cannot reference a field before it is defined,
- //所以必须把n定义移到上面才可以输出
- System.out.println("super-->static");
- }
- public static int n = 10;
- public int x = 100;
- public Father() {
- System.out.println("super's x=" + x);
- age();
- }
- {
- System.out.println("Father Non-Static");
- }
- public void age(){
- System.out.println("nothing");
- }
- }
结果:
super-->static
child-->static
Father Non-Static
super's x=100
age=0
Child Non-Static
The other constructor
child constructor body: 30
x=200
父类静态代码块 -> 子类静态代码块
-> 父类非静态代码块 -> 父类构造函数
-> 子类非静态代码块 -> 子类构造函数
java中,在使用new操作符创建一个类的实例对象的时候,开始分配空间并将成员变量初始化为默认的数值,注意这里并不是指将变量初始化为在变量定义处的初始值,而是给整形赋值0,给字符串赋值null 这一点于C++不同,(student.name = null , student.age = 0 )
然后在进入类的构造函数。
在构造函数里面,首先要检查是否有this或者super调用,this调用是完成本类本身的构造函数之间的调用,super调用是完成对父类的调用。二者只能出现一个,并且只能作为构造函数的第一句出现。在调用this和super的时候实现程序的跳转,转而执行被调用的this构造函数或者super构造函数。
在this和super执行完毕,程序转而执行在类定义的时候进行的变量初始化工作。
这个执行完毕,才是构造函数中剩下的代码的执行。
JAVA程序执行顺序(静态代码块》非静态代码块》静态方法》构造函数)的更多相关文章
- java程序执行顺序
原来自己一直都没弄明白Java程序的执行顺序问题,今天,自己写了个测试,果然与自己考虑的有差距 测试代码: 一个父类Animal 一个子类Dog 测试类Test 运行结果: 所以执行顺序是: 父类An ...
- 一个例子搞清楚Java程序执行顺序
当我们new一个GirlFriend时,我们都做了什么? 一个例子搞懂Java程序运行顺序 public class Girl { Person person = new Person("G ...
- [转]JAVA程序执行顺序,你了解了吗:JAVA中执行顺序,JAVA中赋值顺序
本文主要介绍以下两块内容的执行顺序,熟悉的大虾可以直接飘过. 一.JAVA中执行顺序 静态块 块 构造器 父类构造器 二.JAVA中赋值顺序 静态块直接赋值 块直接赋值 父类继承的属性已赋值 静态变量 ...
- 深入了解Java程序执行顺序
Java中main方法,静态,非静态的执行顺序详解 Java程序运行时,第一件事情就是试图访问main方法,因为main相等于程序的入口,如果没有main方法,程序将无法启动,main方法更是占一个独 ...
- 深入了解类加载过程及Java程序执行顺序
前言 在Java中,静态 Static关键字使用十分常见 本文全面 & 详细解析静态 Static关键字,希望你们会喜欢 目录 1. 定义 一种 表示静态属性的 关键字 / 修饰符 2. 作用 ...
- java 程序执行顺序之继承
1.首先会初始化父类,因为没有父类子类也无从谈起.第一步初始化static 变量 或者 静态初始化话块 2.初始化子类的static 变量 或者 静态初始化块 3.顺序初始化父类普通变量 或者 父类普 ...
- java中子类继承父类程序执行顺序问题
Java中,new一个类的对象,类里面的静态代码块.非静态代码.无参构造方法.有参构造方法.类的一般方法等部分,它们的执行顺序相对来说比较简单,用程序也很容易验证.比如新建一个测试父类. public ...
- java中子类继承父类程序执行顺序
java中子类继承父类程序执行顺序 FatherTest.java public class FatherTest { private String name; public FatherTest() ...
- Flex 程序执行顺序!
Flex 执行加载过程会有几个概念:preloader, SystemManager, Flex Application! flex 界面初始化时,看到的 Loading 加载条,那是 flex 自动 ...
随机推荐
- Neo4j图数据库从入门到精通(转)
add by zhj: 转载时,目录没整理好,还会跳转到原文 其实RDB也可以存储多对多的关系,使用的是中间表,GDB使用的是边,RDB中的实体存储在数据表,而GDB存储在节点.两者使用的底层技术不同 ...
- Mysql系列(十)—— 性能分析工具profiling
转载自:http://www.ywnds.com/?p=8677 explain是从mysql怎样解析执行sql的角度分析sql优劣.profiling是从sql执行时资源使用情况的角度来分析sql. ...
- 关于ipad设备滚动条无法滚动的解决办法
天做一个功能在ipad设备上滚动条无法滚动,于是百度了下,在需要产生滚动的div上面加入以下css(-webkit-overflow-scrolling:touch,overfolw:scroll), ...
- 【spring】spring retry介绍
一.为什么需要重试? 我们知道只要是网络请求都有失败的情况,这个时候增加retry机制是必要的.而spring全家桶中就有这么一套机制. 二.spring retry spring系列的spring ...
- redis的两种持久化方案
前言 人生在于折腾系列,网络,多线程等系列博客楼主还在继续折腾也不会放弃.缓存的知识其实并不仅仅在于简单的增删改查,我觉得有必要全面深入的学习一波.记录学习的过程与体悟. RDB 什么是RDB 对re ...
- eclipse对Java项目进行单元测试
一.右键项目名->buildpath->configure buildpath->add library->junit->选择版本(以4为例)->apply-> ...
- 原生ajax中readyState中的含义以及HTTP协议状态码的含义
xmlhttp.readyState的值及解释: 0:请求未初始化(还没有调用 open()). 1:请求已经建立,但是还没有发送(还没有调用 send()). 2:请求已发送,正在处理中(通常现在可 ...
- 基于windows 10打造的kali工具集
基于windows 10打造的kali工具集.iso,适合于习惯使用windows的安全从业者.if you like it,please touch star! 作为安全从业主,Kali都是必备工具 ...
- flink SourceFunction SinkFunction timeWindowAll reduce
1.实现SourceFunction接口生成数据源 /** * @Description: 产生数据 traceid,userid,timestamp,status,response time */ ...
- 外汇盈利EA
>>>>>>>>>>>>>>>>>>>>>>>>> ...