`
java_mzd
  • 浏览: 583611 次
  • 性别: 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程序执行顺序的详细解释: 1. **静态块**: 静态块是在类加载时执行的,它不依赖于类的实例。在上述代码中,`Mastiff`类的静态块`static block`会在类被加载到JVM(Java虚拟机)时执行,这是在任何...

        Java虚拟机和Java程序的生命周期?

        ### Java虚拟机与Java程序的生命周期 ...了解类的加载过程对于理解Java程序的执行流程、优化性能等方面具有重要意义。同时,掌握Java程序的生命周期有助于更好地控制程序的运行状态,提高程序的健壮性和效率。

        Java程序调用存储过程

        Java程序调用存储过程是数据库操作中的常见任务,特别是在处理大量数据或需要高效执行复杂业务逻辑时。存储过程是预编译的SQL语句集合,它们可以提高性能、减少网络流量,并提供更好的安全性。在Java应用程序中调用...

        如何制作Java可执行程序

        总的来说,将Java程序制作成可执行程序或安装程序,需要根据目标平台和用户需求选择合适的方法。无论是简单的JAR运行,还是复杂的安装程序生成,都有相应的工具和技术支持。理解这些方法可以帮助开发者更好地分发和...

        JAVA程序设计.pdf

        顺序结构是指程序的执行顺序,从上到下依次执行。选择结构是指根据条件选择执行不同的分支,包括if语句和switch语句。循环结构是指重复执行某个语句,包括for语句、while语句和do-while语句。 四、JAVA Application...

        java程序自动重新启动

        在给定的标题"java程序自动重新启动"中,我们可以理解这是一个实现了自动重启逻辑的Java程序。描述指出,这个程序由三个.java文件组成:Test.java、Watch.java和AbstractRun.java,它们构成了一个简单的自动重启系统...

        java程序初始化顺序

        以下是对Java程序初始化顺序的详细说明: 1. **类加载阶段**: - **加载**:当Java虚拟机(JVM)首次遇到一个类的引用时,会通过类加载器进行加载。加载过程包括找到类的.class文件,读取其字节码,并转化为内存中...

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

        Java类的执行顺序是编程过程中一个非常重要的概念,特别是在深入理解和优化代码性能时。本文将详细探讨Java类的加载、初始化、执行等步骤,并通过实例分析阿里面试中可能涉及的相关问题,结合流程图帮助理解这一过程...

        JAVA写的象棋程序

        对于初学者来说,这个程序提供了一个良好的学习平台,可以深入了解面向对象编程、游戏逻辑实现以及GUI(图形用户界面)设计等核心概念。 首先,让我们从编程语言本身开始。Java是一种广泛使用的、跨平台的编程语言...

        java程序的编码通过样例test。java(附执行程序)

        通过分析和运行`test.java`样例,你可以更深入地了解Java程序的编写、编译和执行流程,这对于学习Java编程是非常有帮助的。记得,实践是最好的老师,动手尝试编写和运行自己的Java程序,将理论知识转化为实际操作,...

        存储过程调用java程序

        在存储过程和Java程序的上下文中,SQL*Loader可能用于准备数据,然后由存储过程处理或通过Java程序进行进一步操作。 综上所述,"存储过程调用Java程序"涉及到的主要知识点包括: 1. 存储过程的概念和使用。 2. ...

        java批量执行SQL

        在Java开发过程中,经常需要与数据库进行交互,尤其是在处理大量数据时,如何高效地执行SQL语句变得尤为重要。本文将详细介绍如何利用Java进行批量SQL执行,包括其背景、实现原理、代码示例及优化策略等。 #### 一...

        Java项目制作可执行程序与安装程序_java_

        在本项目中,JNA可能被用来访问特定的系统功能或者与硬件进行交互,增强了Java程序的功能性和效率。 3. **Exe4j**: Exe4j是一款用于生成Windows平台下可执行程序(.exe)的工具。它可以将Java应用打包成一个独立的...

        java用bat运行程序

        通过这个过程,你可以轻松地创建一个.bat文件来运行Java程序,这对于日常开发或者自动化部署非常有用。当然,这只是一个基础示例,实际应用中可能需要处理更复杂的逻辑,如参数传递、异常处理等。理解并掌握这些知识...

        JAVA程序编辑器[java程序编写器]

        "JAVA程序编辑器[java程序编写器]"是一个专为Java初学者设计的工具,它简化了代码编写、编译和调试的过程,使学习变得更加便捷。 这个编辑器的主要特点可能包括: 1. **用户友好界面**:对于初学者,简洁明了的...

        用bat运行java文件中引用了外部jar的java程序

        首先,我们需要了解Java程序的运行机制。Java程序是由JVM(Java虚拟机)执行的,通过`java`命令来启动。如果Java程序依赖于外部的jar库,我们可以通过`-cp`或`-classpath`选项指定类路径,使得JVM能够找到这些库。...

        通过JAVA执行命令行程序

        本文将详细讲解如何通过Java执行命令行程序,以及在处理过程中可能遇到的线程阻塞问题。 首先,我们来看标题提到的"通过JAVA执行命令行程序"。Java提供了Runtime类的exec()方法来执行外部命令。例如,如果你想要在...

        java 开发第一个Java程序

        在Java编程世界中,开发第一个Java程序是每个初学者必经的步骤,它标志着你正式踏入这个强大且广泛应用的编程语言领域。Java以其跨平台、面向对象和安全性等特性,被广泛应用于各种软件开发,包括桌面应用、移动应用...

        熟悉java程序的开发

        了解并掌握这些基本概念对于初学者来说至关重要,因为它们构成了Java程序开发的基础。随着对Java语言的深入学习,你还将接触到类、对象、继承、多态等面向对象编程的核心概念,以及异常处理、输入/输出流、集合框架...

      Global site tag (gtag.js) - Google Analytics