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

  相同点:都是在JVM加载类时且在构造方法执行之前执行,在类中都可以定义多个,一般在代码块中对一些static变量进行赋值。

  不同点:静态代码块在非静态代码块之前执行(静态代码块—>非静态代码块—>构造方法)。

    静态代码块只在第一次new执行一次,之后不再执行,而非静态代码块在每new一次就执行一次。非静态代码块可在普通方法中定义(不过作用不大);而静态代码块不行。JVM加载类时会执行这些静态的代码块,如果static代码块有多个,JVM将按照它们在类中出现的先后顺序依次执行它们,每个代码块只会被执行一次。

Example1:

    1. public class PuTong {
    2. public PuTong(){
    3. System.out.print("默认构造方法!-->");
    4. }
    5. //非静态代码块
    6. {
    7. System.out.print("非静态代码块!-->");
    8. }
    9. //静态代码块
    10. static{
    11. System.out.print("静态代码块!-->");
    12. }
    13. public static void test(){
    14. {
    15. System.out.println("普通方法中的代码块!");
    16. }
    17. }
    18. }
    19. //测试类
    20. public class TestClass {
    21. /**
    22. * 区别两次new静态与非静态代码块执行情况
    23. */
    24. public static void main(String[] args) {
    25. PuTong c1 = new PuTong();
    26. c1.test();
    27. PuTong c2 = new PuTong();
    28. c2.test();
    29. }
    30. }
    31. /*
    32. 运行输出结果是:
    33. 静态代码块!-->非静态代码块!-->默认构造方法!-->普通方法中的代码块!
    34. 非静态代码块!-->默认构造方法!-->普通方法中的代码块!
    35. */

Example2:

  1. package tags;
  2. public class Child extends Father{
  3. static {
  4. System.out.println("child-->static");
  5. }
  6. private int n = 20;
  7. {
  8. System.out.println("Child Non-Static");
  9. n = 30;
  10. }
  11. public int x = 200;
  12. public Child() {
  13. this("The other constructor");
  14. System.out.println("child constructor body: " + n);
  15. }
  16. public Child(String s) {
  17. System.out.println(s);
  18. }
  19. public void age() {
  20. System.out.println("age=" + n);
  21. }
  22. public void printX() {
  23. System.out.println("x=" + x);
  24. }
  25. public static void main(String[] args) {
  26. new Child().printX();
  27. }
  28. }
  29. class Father {
  30. static {
  31. //System.out.println("n+"+n);
  32. //当n定义在下面时,会提示Cannot reference a field before it is defined,
  33. //所以必须把n定义移到上面才可以输出
  34. System.out.println("super-->static");
  35. }
  36. public static int n = 10;
  37. public int x = 100;
  38. public Father() {
  39. System.out.println("super's x=" + x);
  40. age();
  41. }
  42. {
  43. System.out.println("Father Non-Static");
  44. }
  45. public void age(){
  46. System.out.println("nothing");
  47. }
  48. }

结果:

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执行完毕,程序转而执行在类定义的时候进行的变量初始化工作。这个执行完毕,才是构造函数中剩下的代码的执行。

静态代码块&非静态代码块&构造函数的更多相关文章

  1. Java代码执行顺序(静态变量,非静态变量,静态代码块,代码块,构造函数)加载顺序

    //据说这是一道阿里巴巴面试题,先以这道题为例分析下 public class Text { public static int k = 0; public static Text t1 = new ...

  2. java synchronized静态同步方法与非静态同步方法,同步语句块

    摘自:http://topmanopensource.iteye.com/blog/1738178 进行多线程编程,同步控制是非常重要的,而同步控制就涉及到了锁. 对代码进行同步控制我们可以选择同步方 ...

  3. java 静态资源,非静态资源,父类子类,构造方法之间的初始化循序

    java面试经常被问静态资源,非静态资源,父类子类,构造方法之间的执行顺序.下面添加两个类做个测试 class Parent { // 静态变量 public static String p_Stat ...

  4. Java静态同步方法和非静态同步方法

             所有的非静态同步方法用的都是同一把锁——该实例对象本身.也就是说如果一个实例对象的非静态同步方法获取锁后,该实例对象的其他非静态同步方法必须等待获取锁的方法释放锁后才能获取锁进而执行 ...

  5. 非静态代码块(非static初始化块)&静态代码块(static初始化块)

    非静态代码块: TestOrder: package com.aff.singleton; /* 类的第四个成员:初始化块(代码块) 代码块: 如果有修饰的话只能使用static 分类:非静态代码块: ...

  6. Java类加载信息的顺序:包括静态代码快、静态类变量、非静态代码快、构造方法、普通方法

    JVM运行之前会执行一个叫做类加载器的子系统,叫做ClassLoader,那么类里面那么多“元素”,究竟是个什么顺序呢,写几行代码测试一下,通过给每个方法和代码快和静态变量打上断点来测试: class ...

  7. c#静态变量和非静态变量的区别

    静态变量的类型说明符是static.静态变量当然是属于静态存储方式,但是属于静态存储方式的量不一定就是静态变量,例如外部变量虽属于静态存储方式,但不一定是静态变量,必须由 static加以定义后才能成 ...

  8. Java的外部类和内部类+静态变量和非静态变量的组合关系

    看的李刚<疯狂java讲义>,里面讲内部类的地方感觉有点散而且不全,看完之后还是不十分清楚到底怎么用,于是自己写了个程序测试了一下.看如下代码,即可知道外部类和内部类+静态成员和非静态成员 ...

  9. ARC代码和非ARC代码 混用

    选中工程->TARGETS->相应的target然后选中右侧的“Build Phases”,向下就找到“Compile Sources”了.然后在相应的文件后面添加:-fobjc-arc参 ...

随机推荐

  1. Matlab学习过程中的一些小问题

    1.Overload your functions by having variable number of input and output argumernt.Not only can we ov ...

  2. Ant Design中根据用户交互展示不同的标签

    Ant Design中根据用户交互展示不同的标签 Ant Design使用的是React框架,那么我们先看代码: <Fragment> <a onClick={() => th ...

  3. 由数据迁移至MongoDB导致的数据不一致问题及解决方案

    故事背景 企业现状 2019年年初,我接到了一个神秘电话,电话那头竟然准确的说出了我的昵称:上海小胖. 我想这事情不简单,就回了句:您好,我是小胖,请问您是? "我就是刚刚加了你微信的 xx ...

  4. PHP计算每月几周,每周的开始结束日期

    PHP计算每月几周,每周的开始结束日期 因为项目中需要一个每周工作计算的功能,具体日期的算法是,把每月拆分成几个周,最后一个星期这个月份的天数不够就补上下个月的. 列如今天8月27星期一,这个月有31 ...

  5. 【转】20个简化开发任务的 JavaScript库

    原文出处: codegeekz   译文出处: oschina 所谓JavaScript库就是预先写好的可以简化基于JavaScript的应用程序开发的,尤其是Ajax和其它以web为中心的技术的 J ...

  6. python递归(函数)

    递归:一个过程或函数调用自身的一种方法. 1. 效果图 2. 代码 def factorial(n): ''' 该函数用来求任意数的阶乘 参数: n 要求阶乘的数字 ''' # 基线条件 判断n是否为 ...

  7. 通过ArcGIS将数据存储到SQL Server2012中

    一.软件安装: ARCGIS 10.3安装 SQLserver2012安装 ARCGIS 10.3 安装(注意ARCGIS10.3并不用安装配置ARCSDE). https://wenku.baidu ...

  8. Webpack实战(四):教教你如何轻松搞定-预处理器(loader)

    前面三节,我主要给大家分享了有关webpack的一些配置的知识点,如何打包js文件,而如果我们遇到其他类型的资源如图片.css.字体font等等,我们该如何处理呢?今天会介绍预处理器(loader), ...

  9. DataFrame数据合并

    一.join 作用:默认情况下,他是把行索引相同的数据合并到一起注意:以左为准,没有的部分用NaN补全 例子 import pandas as pd import numpy as np df1 = ...

  10. Codeforces940掉分记

    掉分经过 难得这次时间比较好,下午17:35开始. 本来还很高兴,心想这回肯定不会犯困,没准排名能再上升一些呢,,可惜事与愿违-- 上来a题,光看懂题就花了一些时间. 然后开始写,结果第一遍CE,第二 ...