本文主要介绍以下两块内容的执行顺序,熟悉的大虾可以直接飘过。

一。JAVA中执行顺序

  1. 静态块
  2. 构造器
  3. 父类构造器

二。JAVA中赋值顺序

  1. 静态块直接赋值
  2. 块直接赋值
  3. 父类继承的属性已赋值
  4. 静态变量声明时赋值
  5. 成员变量声明时赋值
  6. 构造器赋值

第一部分很好测试,我们只需要写一个子类,类中定义一个静态块,一个普通块,一个构造器,它的父类构造器,都打印一条语句,即可明白它们直接的执行顺序

Mastiff类

  1. <span style="font-size: medium;">/**
  2. * 子类藏獒
  3. */
  4. public class Mastiff extends Dog {
  5. public Mastiff() {
  6. System.out.println("Mastiff");
  7. }
  8. {
  9. System.out.println("block");
  10. }
  11. static {
  12. System.out.println("static block");
  13. }
  14. public static void  main(String[] args){
  15. Mastiff mastiff=new Mastiff();
  16. }
  17. }
  18. </span>

DOG类

  1. <span style="font-size: medium;">/**
  2. *DOG父类
  3. */
  4. public class Dog {
  5. public Dog() {
  6. System.out.println("Dog");
  7. }
  8. }
  9. </span>

运行结果为:

static block
Dog
block
Mastiff

也就是说,在我们的程序中,实例化一个类对象的时候,运行顺序为:

  1. 静态块
  2. 父类构造器
  3. 本类中的块
  4. 本类的构造器

我们可以更进一步,如果在父类中也有块和静态块呢?

DOG类改进后源码

  1. <span style="font-size: medium;">/**
  2. *DOG父类
  3. */
  4. public class Dog {
  5. public Dog() {
  6. System.out.println("Dog");
  7. }
  8. static{
  9. System.out.println("super static block");
  10. }
  11. {
  12. System.out.println("super block");
  13. }
  14. }
  15. </span>

Mastiff改进后源码

  1. <span style="font-size: medium;">/**
  2. * 子类藏獒
  3. */
  4. public class Mastiff extends Dog {
  5. public Mastiff() {
  6. System.out.println("Mastiff");
  7. }
  8. {
  9. System.out.println("block");
  10. }
  11. static {
  12. System.out.println("static block");
  13. }
  14. public static void  main(String[] args){
  15. Mastiff mastiff=new Mastiff();
  16. }
  17. }
  18. </span>

运行的结果为:

super static block
static block
super block
Dog
block
Mastiff

也就是说此时的运行顺序为:

  1. 父类静态块
  2. 自身静态块
  3. 父类块
  4. 父类构造器
  5. 自身块
  6. 自身构造器

好了,知道了运行的顺序,那么这是为什么呢?

这就要从JVM中类的装载机制和实例化机制开始说起,这里因为主题原因,先不讨论,有兴趣的同学可以自己查资料。

我们再来讨论第二个问题,一个变量的值,它有可能在哪些地方确定呢??

  1. 从父类继承该值(包括:1.作为父类的成员变量已经赋值  2.在父类的块中赋值  3.在父类的构造器中赋值)
  2. 在构造器中对其进行赋值
  3. 在块中进行赋值
  4. 在方法调用中进行赋值

现在假设在我们刚刚的例子中,有一个变量type,表示狗的品种

  1. <span style="font-size: medium;">/**
  2. *DOG父类
  3. */
  4. public class Dog {
  5. public String type="父类成员变量赋的值";
  6. public Dog() {
  7. System.out.println("父类构造器--type-->"+type);
  8. type="父类构造器赋的值";
  9. System.out.println("父类构造器----type--->"+type);
  10. }
  11. {
  12. System.out.println("block---type--->"+type);
  13. type="父类块赋的值";
  14. }
  15. }
  16. </span>
  1. <span style="font-size: medium;">/**
  2. * 子类藏獒
  3. */
  4. public class Mastiff extends Dog {
  5. public String type="成员变量赋的值";
  6. public Mastiff() {
  7. System.out.println("构造器---type--->"+type);
  8. type="构造器赋的值";
  9. }
  10. public void say(){
  11. System.out.println("say---type---->"+type);
  12. }
  13. {
  14. System.out.println("block---type--->"+type);
  15. type="块赋的值";
  16. }
  17. public static void  main(String[] args){
  18. Mastiff mastiff=new Mastiff();
  19. mastiff.say()</span><span style="font-size: medium;">;</span><span style="font-size: medium;">
  20. }
  21. }
  22. </span>

执行结果如下:

block---type--->父类成员变量赋的值
父类构造器--type-->父类块赋的值
父类构造器----type--->父类构造器赋的值
block---type--->成员变量赋的值
构造器---type--->块赋的值
say---type---->构造器赋的值

答案很明显,赋值顺序为:

  1. 父类成员变量赋值
  2. 父类块赋值
  3. 父类构造器赋值
  4. 自身成员变量赋值
  5. 自身块赋值
  6. 自身构造器赋值

结合我们前面说的程序中的执行顺序,这个显然是很好理解的:

1.成员变量赋值>>>块赋值>>>构造器赋值

2.父类的块>>父类构造器>>自身块>>自身构造器

又因为一个成员变量是不可能在静态变量中赋值的,而且又前面程序执行顺序可知

静态块>>块

所以,程序的赋值步骤为

  1. 父类的静态变量赋值
  2. 自身的静态变量赋值
  3. 父类成员变量赋值
  4. 父类块赋值
  5. 父类构造器赋值
  6. 自身成员变量赋值
  7. 自身块赋值
  8. 自身构造器赋值

[转]JAVA程序执行顺序,你了解了吗:JAVA中执行顺序,JAVA中赋值顺序的更多相关文章

  1. Java程序员从笨鸟到菜鸟之(十三)java网络通信编程

    本文来自:曹胜欢博客专栏.转载请注明出处:http://blog.csdn.net/csh624366188 首先声明一下,刚开始学习java网络通信编程就对他有一种畏惧感,因为自己对网络一窍不通,所 ...

  2. 《JAVA 程序员面试宝典(第四版)》之JAVA程序设计基础概念(1)类型转换

      问题主题:类型转换   书页号码:37页 题目: 讨论点:答案不是D,应该是B 理由:看下面在编译器输入的结果 知识扩展:装箱与拆箱, == 与 equals 区别 之前也老是听说什么装箱.拆箱之 ...

  3. 编写Java程序,实现对兵营类的封装,将兵营类中的所有属性设置为私有访问权限,方法设置为公有访问权限

    返回本章节 返回作业目录 需求说明: 实现对兵营类的封装 将兵营类中的所有属性设置为私有访问权限. 将兵营类中所有属性的赋值方法设置为公有访问权限. 要求兵营名称的长度在4-8位之间. 要求兵营士兵的 ...

  4. Java起源、发展历程、环境变量、第一个Java程序等【1】

    若有不正之处,请多多谅解并欢迎批评指正,不甚感激. 请尊重作者劳动成果,转载请标明原文链接: 本文原创作者:pipi-changing 本文原创出处:http://www.cnblogs.com/pi ...

  5. 【转】介绍Jython,第一部分:轻轻松松写JAVA程序

    本文转自:http://www.ibm.com/developerworks/cn/education/java/j-jython1/index.html 关于本教程 本教程介绍哪些内容? 这个两部分 ...

  6. java程序的加载过程

    昨天笔试阿里有个求java程序加载过程的题目很是复杂,回来研究了好久才有点明白,整理一下.原题代码如下,判断输出: public class StaticTest { public static in ...

  7. JAVA程序员必看的15本书-JAVA自学书籍推荐

    作为Java程序员来说,最痛苦的事情莫过于可以选择的范围太广,可以读的书太多,往往容易无所适从.我想就我自己读过的技术书籍中挑选出来一些,按照学习的先后顺序,推荐给大家,特别是那些想不断提高自己技术水 ...

  8. Java程序员面试题集(1-50

    下面的内容是对网上原有的Java面试题集及答案进行了全面修订之后给出的负责任的题目和答案,原来的题目中有很多重复题目和无价值的题目,还有不少的参考答案也是错误的,修改后的Java面试题集参照了JDK最 ...

  9. 不错的linux下通用的java程序启动脚本

    不错的linux下通用的java程序启动脚本(转载) 虽然写起动shell的频率非常不高...但是每次要写都要对付一大堆的jar文件路径,新加jar包也必须要修改起动shell. 在网上找到一个挺好的 ...

  10. 不错的linux下通用的java程序启动脚本(转载)

    转自:http://www.cnblogs.com/langtianya/p/4164151.html 虽然写起动shell的频率非常不高...但是每次要写都要对付一大堆的jar文件路径,新加jar包 ...

随机推荐

  1. 【POJ2104/2761】K-th Number

    Description You are working for Macrohard company in data structures department. After failing your ...

  2. vs2013的单元测试 第一部分

    这次的vs2013的单元测试我学到了许多,虽然到现在我还是不能完成,但是我也学到了许多. 首先,在vs2013中先安装Unit Test Generator,如图所示: 这个是进行单元测试重要的一个插 ...

  3. Maven Repository

    The usefully link for Maven Reponsitory display as below: http://mvnrepository.com/ For example, To ...

  4. 解决mysql5.6+在zabbix监控中执行脚本出现密码的错误问题

    1.mysql命令行中授权mysql监控所需的账号和密码(权限select权限即可) 2.通过mysql_config_editor 配置登录问题: [root@back_zabbix_100 scr ...

  5. Jfinal中手动提交/回滚 事物

    在Jfinal中有个Tx类为事物声明类 在方法或controller上面加@Before({Tx.class})即可,可是这样并不能满足有的业务场景 下面是今天写的手动提交的事物处理方法,希望对大家有 ...

  6. php中英字符串截取

    <?php @header('Content-type: text/html; charset=UTF-8'); function Ctruncate($str = '', $len = 0, ...

  7. python 语料处理(从文件夹中读取文件夹中文件,分词,去停用词,去单个字)

    # -*- coding:utf8 -*- import os import jieba def splitSentence(inputFile): fin = open(inputFile, 'r' ...

  8. php课程---JavaScript改变HTML中的元素

    <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/ ...

  9. 【iCore3 双核心板】例程十四:FATFS实验——文件操作

    实验指导书及代码包下载: http://pan.baidu.com/s/1dEpechF iCore3 购买链接: https://item.taobao.com/item.htm?id=524229 ...

  10. Apache Spark技术实战之4 -- 利用Spark将json文件导入Cassandra

    欢迎转载,转载请注明出处. 概要 本文简要介绍如何使用spark-cassandra-connector将json文件导入到cassandra数据库,这是一个使用spark的综合性示例. 前提条件 假 ...