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

一。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. 【JAVA】Spring 事物管理

            在Spring事务管理中通过TransactionProxyFactoryBean配置事务信息,此类通过3个重要接口完成事务的配置及相关操作,分别是PlatformTransactio ...

  2. 详解SpringMVC请求的时候是如何找到正确的Controller[附带源码分析]

    目录 前言 源码分析 重要接口介绍 SpringMVC初始化的时候做了什么 HandlerExecutionChain的获取 实例 资源文件映射 总结 参考资料 前言 SpringMVC是目前主流的W ...

  3. Controller 通信 发布接收广播

    在Angularjs开发一些经验总结随笔中提到我们需要按照业务却分angular controller,避免过大无所不能的上帝controller,我们把controller分离开了,但是有时候我们需 ...

  4. mysql命令行参数(转)

    MySQL命令行参数 Usage: mysql [OPTIONS] [database] //命令方式  -?, --help //显示帮助信息并退出  -I, --help //显示帮助信息并退出  ...

  5. Hive_初步见解,安装部署与测试

    一.hive是什么东东 1. 个人理解 hive就是一个基于hdfs运行于MapReduce上的一个java项目, 这个项目封装了jdbc,根据hdfs编写了处理数据库的DDL/DML,自带的 二进制 ...

  6. 无法在提交表单前通过ajax验证解决办法

    博主在一个小项目中,要实现注册表单无刷新验证用户名或密码,但是发现不管怎么样都无法在先通过ajax验证之前不提交表单. 例如:一个简单的验证函数 function check(){ $.post(&q ...

  7. Window.onload与$(document).ready()的对比

  8. Jquery dialog属性

    修改标题: $('#test').dialog("option","title", "测试").dialog('open'); 修改位置: ...

  9. vs2013打开 2010项目时: 请确认 <Import> 声明中的路径正确,且磁盘上存在该文件

    错误原因:原来2010项目中使用的路径是 v11.0,但是我的 C:\Program Files (x86)\MSBuild\12.0\ 是 12.0,所以该成 12.0 解决办法:将项目文件(.cs ...

  10. Python 脚本 监控数据库状态

    打算用这个脚本通过zabbix 监控Mariadb的,无奈要等Mariadb完全上线才行,所以先写一个粗略大致功能的版本. #coding:utf-8 #author:shiyiwen #versio ...