`
java_mzd
  • 浏览: 580250 次
  • 性别: Icon_minigender_1
  • 来自: 长沙
社区版块
存档分类
最新评论

JAVA程序执行顺序,你了解了吗?

阅读更多

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


     一。JAVA中执行顺序

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

    二。JAVA中赋值顺序

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

 

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

 

Mastiff类

 

/**
 * 子类藏獒
 */
public class Mastiff extends Dog {
	public Mastiff() {
		System.out.println("Mastiff");
	}

	{
		System.out.println("block");
	}
	static {
		System.out.println("static block");
	}
	
	public static void  main(String[] args){
		Mastiff mastiff=new Mastiff();
		
	}
}

 

 

  DOG类

 

/**
 *DOG父类
 */
public class Dog {
	public Dog() {
		System.out.println("Dog");
	}
}

 

运行结果为:

static block
Dog
block
Mastiff

 

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

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

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

    DOG类改进后源码 

/**
 *DOG父类
 */
public class Dog {
	public Dog() {
		System.out.println("Dog");
	}
	static{
		System.out.println("super static block");
	}
	
	{
		System.out.println("super block");
	}
}

  

   Mastiff改进后源码

/**
 * 子类藏獒
 */
public class Mastiff extends Dog {
	public Mastiff() {
		System.out.println("Mastiff");
	}

	{
		System.out.println("block");
		
	}
	static {
		System.out.println("static block");
	}
	
	public static void  main(String[] args){
		Mastiff mastiff=new Mastiff();		
	}
}

 

运行的结果为:

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,表示狗的品种

 

/**
 *DOG父类
 */
public class Dog {
	public String type="父类成员变量赋的值";
	public Dog() {
		System.out.println("父类构造器--type-->"+type);
		type="父类构造器赋的值";
                   System.out.println("父类构造器----type--->"+type);
	}
	
	{
		System.out.println("block---type--->"+type);
		type="父类块赋的值";
	}
}

 

   

/**
 * 子类藏獒
 */
public class Mastiff extends Dog {
	public String type="成员变量赋的值";
	public Mastiff() {
		System.out.println("构造器---type--->"+type);
		type="构造器赋的值";
	}
	
	public void say(){
		System.out.println("say---type---->"+type);
	}

	{
		System.out.println("block---type--->"+type);
		type="块赋的值";
		
	}
	
	public static void  main(String[] args){
		Mastiff mastiff=new Mastiff();
		mastiff.say();		
	}
}

   

 

 执行结果如下:

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. 自身构造器赋值

       

      32
      1
      分享到:
      评论
      14 楼 bljoohe 2015-04-20  
      http://www.toceansoft.com/
      13 楼 JIRA 2011-01-11  
      12 楼 二十五岁才出道 2010-12-24  
      第一次发帖哦,不错,虽然基础,但是以前没有注意这些东西。
      11 楼 LD_21 2010-12-19  
       
      10 楼 java_mzd 2010-12-17  
      ejacky 写道
      不难啊 ,原来 我 太看低自己了  。

      self-confidence is very important。
        i can speak   English fluently too.哈哈哈
      9 楼 ejacky 2010-12-17  
      不难啊 ,原来 我 太看低自己了  。
      8 楼 java_mzd 2010-12-17  
      buptwhisper 写道
      1.static and instance invoked sequence

      static >  instance (always)

      2.static initialize and static block

      the order as the java source code

      3. instance initialize  and initialize block

      similar with static, the order as the java source code


      when you new a instance, first initialize the class info(Inheritance Structure tree from top to bottom, and here the static ones will be invoked), and then the instance initialize, and then constructor(still the Inheritance Structure tree from top to bottom).

        呵呵,高人啊,全英文。
      恩,谢谢您的体现。
      我前天查资料也发现,其实块和声明变量的时候赋值,执行顺序是根据代码的顺序决定的。 如果不是static类型的,则都是分解为两部分,一部分为变量声明,为变量提供内存空间,还有一部分被提取到构造器中进行赋值。
      因为忙着6级考试呢。都还没来的及改呢。
      感谢高人的提醒,也为误导了大家表示歉意。
      7 楼 buptwhisper 2010-12-17  
      1.static and instance invoked sequence

      static >  instance (always)

      2.static initialize and static block

      the order as the java source code

      3. instance initialize  and initialize block

      similar with static, the order as the java source code


      when you new a instance, first initialize the class info(Inheritance Structure tree from top to bottom, and here the static ones will be invoked), and then the instance initialize, and then constructor(still the Inheritance Structure tree from top to bottom).
      6 楼 0704681032 2010-12-16  
      支持楼主..
      5 楼 凤凰山 2010-12-15  
       
      4 楼 左看右看 2010-12-15  
      很好,很有必要学习一下这些基础的东西。
      3 楼 hunan84229247 2010-12-12  
      good
      2 楼 java_mzd 2010-12-10  
      iuf6853 写道
      分析的好!


        谢谢捧场。。。
      1 楼 iuf6853 2010-12-10  
      分析的好!

      相关推荐

        JAVA程序执行顺序,你了解了吗.doc

        JAVA程序执行顺序,你了解了吗

        Java类执行顺序详解+实例(阿里面试题)+详细讲解+流程图

        Java类执行顺序详解+实例(阿里面试题)+详细讲解+流程图

        自考04747《Java语言程序设计》课后习题答案全集.doc

        1.1 指出JAVA语言的主要特点和JAVA程序的执行过程。 5 1.2 说出开发与运行JAVA程序的重要步骤。 5 1.3 如何区分应用程序和小应用程序? 5 1.4 说出JAVA源文件的命名规则。 5 1.6 JAVA语言使用什么字符集?共有多少个...

        西南科技大学Java程序设计与实践 实验四 GUI实验实验报告及源码

        西南科技大学Java程序设计与实践 实验一、实验目的: 练习面向对象的图形用户界面设计、界面布局、事件设计方 法。 二、实验内容: 设计一个类似Windows计算器的Application应用程序。 三、实验要求: 1、采用Java ...

        什么是Java中的异常处理机制?Java中的异常分为哪些类型?(java面试题附答案).txt

        当程序执行过程中出现异常时,异常处理机制允许我们捕获和处理这些异常,以便程序能够以一种可控的方式处理错误情况。 Java中的异常分为三种类型:检查型异常(Checked Exception)、非检查型异常(Unchecked ...

        java打包成可执行程序

        java打包方法详述主要讲怎么导出包,利用JSmooth将jar包打包成可执行程序的过程

        java 面对对象编程.pdf.zip

        如果一个类没有声明构造方法,该程序能正确执行吗? 构造方法有哪些特点?是否可被 override? 面向对象三大特征 封装 继承 多态 接口和抽象类有什么共同点和区别? 深拷贝和浅拷贝区别了解吗?什么是引用拷贝? Java ...

        java程序中的内存分配问题

        本例通过一个简单的java程序来阐述了程序在执行过程中内存的动态分配,但分析过程非常详细,适合java初学者

        Java基础教案\JAVA精讲入门

         编译执行第一个Java程序 教学方法:  比较与比喻教学方式,提高学生的学习兴趣  程序调适,让学生对Java程序获取感性认识,激发兴趣;  适度提问,养成学生勤于思考的学习习惯 教学过程设计: 1.讨论,...

        Java程序设计基础:设计解决问题的策略.pptx

        设计解决问题 的策略 基本程序设计--设计解决问题的策略 本讲主题 1 理解什么是程序 2 了解程序设计的基本步骤 3 掌握设计解决问题的策略 程序一词来自生活,通常指完成某些事物的一...//Java程序 public class Comput

        计算机程序设计(Java)-教案--单元二--Java语言开发基础.docx.docx

        课程名称 Java程序设计 教师姓名 专业班级 授课时间 授课地点 学时数 8 授课题目 §2Java语言开发基础 教学目标及要求 知识目标 掌握Java语言的基本组成; :・掌握数据类型、变量、运算符及表达式; :・掌握三种...

        Java 应用程序中定时执行任务的定时器框架

        所有类型的 Java 应用程序一般都需要计划重复执行的任务。企业应用程序需要计划每日的日志或者晚间批处理过程。一个 J2SE或者 J2ME 日历应用程序需要根据用户的约定计划闹铃时间。不过,标准的调度类 Timer 和 ...

        Java常见面试题208道.docx

        47.在 java 程序中怎么保证多线程的运行安全? 48.多线程锁的升级原理是什么? 49.什么是死锁? 50.怎么防止死锁? 51.ThreadLocal 是什么?有哪些使用场景? 52.说一下 synchronized 底层实现原理? 53....

        换器也兼容其他多版本的JAVA程序,比如S40手机的JAVA程序

        【批处理文件 ★自动打包★.bat】是为了简化制作JAVA程序复杂过程的特殊文件,对DOS命令不熟悉的人有很大的帮助。 下面是三个主程序和一个需要转换的JAVA游戏。 由于这个模拟器主要是真对MIDP1.1开发的,所以有些...

        一个java的计算器

        一个java的计算器一个java的计算器一个java的计算器一个java的计算器一个java的计算器一个java的计算器

        存储过程调用java程序

        NULL 博文链接:https://ytdolly.iteye.com/blog/782051

        Java服务器程序设计

        用java进行客户端的applet (小程序)开发的技术已广为使用,而用java进行服务器端的servlet(服务器小程序)开发则尚需揭开其神秘的面纱,本书正是基于这样的目的编写的。全书从java服务器的体系结构、开发工具和...

        java中带super关键字的程序内存分析

        想要下载此文件,请先下载本人“java程序中的内存分配问题”,因为那个例子比较简单而且分析详细透彻,可以使你更容易理解,如果你对java程序执行过程中的内存分配有一定的了解,可以直接下载本文件

        java面试题20道(适合工作1~3年)(附答案).docx

        程序中是先执行拦截器还是过滤器?请描述Mybatis结果集中 ResultMap 和ResultType的区别。Java中 @PostConstruct和@PreDestroy注解有什么作用?编写Webservice接口服务端(框架)有几种方式?常用的缓存框架有哪几个...

        java面试题静态加载顺序构造方法

        记住,面试有可能会标出一些语句的,让你选择这些语句的执行顺序。不过只要知道原理,就没什么难的了。 执行先后顺序: 1、类加载到内存时static 加载进内润 2、调用类的构造方法时先调用父类的构造方法,在调用...

      Global site tag (gtag.js) - Google Analytics