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

一。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. 【BZOJ2190】【SDOI2008】仪仗队

    Description 作为体育委员,C君负责这次运动会仪仗队的训练.仪仗队是由学生组成的N * N的方阵,为了保证队伍在行进中整齐划一,C君会跟在仪仗队的左后方,根据其视线所及的学生人数来判断队伍是 ...

  2. Undefined symbols for architecture x86_64: "_OBJC_CLASS_$_GiftAnimationView"

    1> error 详情: Undefined symbols for architecture x86_64: "_OBJC_CLASS_$_GiftAnimationView&quo ...

  3. App所需申请资料

    准备资料 企业五证 营业执照 税务登记证 组织机构代码证 银行开户许可证 法人身份证 新邮箱 申请一个新的邮箱地址,供申请以下材料使用 苹果证书申请 AppleID 申请邓氏编码需要有AppleID ...

  4. PHP.ini文件读取不到

    Configuration File (php.ini) Path /usr/local/php/lib Loaded Configuration File (none) Linux 把 dtruss ...

  5. Visio 2007/2010 左侧"形状"窗口管理

    Visio 2007/2010 左侧"形状"窗口管理 Visio 打开后,通常窗口左侧会有一个“形状”面板,我们可以方便地从中选择需要的形状.有时为了获得更大的版面空间或者不小心关 ...

  6. 学习PHP第一天-----简单登录

    <!DOCTYPE html> <html> <head> <title>初级登录界面</title> </head> < ...

  7. [LintCode] Add and Search Word 添加和查找单词

    Design a data structure that supports the following two operations: addWord(word) and search(word) s ...

  8. u盘安装windows系统

    使用老毛桃为例: 电脑下载老毛桃到自己电脑,插入U盘,制作U盘为启动盘. 四种安装方法: 1.win7能够使用:(win中包含iso的解压文件)解压ISO ----〉 restart win7 --- ...

  9. linux笔记六-------文件权限设置

    1.文件(目录)权限本身划分:读read   写write   执行execute 权限从用户的角度划分:主人权限user    同组用户权限group    其他组用户的权限other music. ...

  10. Oracle手工建库

    环境准备 手工建库的前提是ORACLE软件已经正确安装到操作系统中,只是需要我们利用ORACLE软件提供的一些工具和脚本来创建一个数据库,创建这个数据库可以运行DBCA工具图形化创建,也可以使用CRE ...