`
fp_moon
  • 浏览: 981741 次
  • 性别: Icon_minigender_1
  • 来自: 深圳
社区版块
存档分类
最新评论

JAVA程序执行顺序 ----收藏

阅读更多

本文转自:http://java-mzd.iteye.com/blog/838683

作者:java_mzd

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


     一。JAVA中执行顺序


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

    二。JAVA中赋值顺序


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

 


 第一部分很好测试,我们只需要写一个子类,类中定义一个静态块,一个普通块,一个构造器,它的父类

构造器,都打印一条语句,即可明白它们直接的执行顺序


 


Mastiff类


 

Java代码
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.    {  
10.        System.out.println("block");  
11.    }  
12.    static {  
13.        System.out.println("static block");  
14.    }  
15.      
16.    public static void  main(String[] args){  
17.        Mastiff mastiff=new Mastiff();  
18.          
19.    }  
20.}  
21.</SPAN> 
/**
 * 子类藏獒
 */
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类


 

Java代码
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> 
/**
 *DOG父类
 */
public class Dog {
 public Dog() {
  System.out.println("Dog");
 }
}
 


运行结果为:

 

   static block
Dog
block
Mastiff
 
 
 


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


1.  静态块
2.  父类构造器
3.  本类中的块
4.  本类的构造器
我们可以更进一步,如果在父类中也有块和静态块呢?

    DOG类改进后源码

Java代码
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.    {  
13.        System.out.println("super block");  
14.    }  
15.}  
16.</SPAN> 
/**
 *DOG父类
 */
public class Dog {
 public Dog() {
  System.out.println("Dog");
 }
 static{
  System.out.println("super static block");
 }
 
 {
  System.out.println("super block");
 }
}
 

   Mastiff改进后源码

Java代码
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.    {  
10.        System.out.println("block");  
11.          
12.    }  
13.    static {  
14.        System.out.println("static block");  
15.    }  
16.      
17.    public static void  main(String[] args){  
18.        Mastiff mastiff=new Mastiff();        
19.    }  
20.}  
21.</SPAN> 
/**
 * 子类藏獒
 */
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,表示狗的品种


 


Java代码
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.    {  
13.        System.out.println("block---type--->"+type);  
14.        type="父类块赋的值";  
15.    }  
16.}  
17.</SPAN> 
/**
 *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="父类块赋的值";
 }
}
 

  

Java代码
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.      
11.    public void say(){  
12.        System.out.println("say---type---->"+type);  
13.    }  
14. 
15.    {  
16.        System.out.println("block---type--->"+type);  
17.        type="块赋的值";  
18.          
19.    }  
20.      
21.    public static void  main(String[] args){  
22.        Mastiff mastiff=new Mastiff();  
23.        mastiff.say()</SPAN><SPAN style="FONT-SIZE: medium">;</SPAN><SPAN style="FONT-SIZE:

medium">          
24.    }  
25.}  
26.</SPAN> 
/**
 * 子类藏獒
 */
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.自身构造器赋值

分享到:
评论

相关推荐

    JAVA语言程序设计--第二章JAVA基础

    控制结构如if语句、switch语句、for循环和while循环则是程序流程控制的关键,它们决定了代码执行的顺序。 接着,我们会深入到类和对象的概念,这是Java面向对象编程的核心。类是对象的模板,定义了一组属性(成员...

    Java程序设计--复习要点.doc

    Java程序由Java源代码编译成字节码(.class文件),然后由JVM解释执行。这种半编译半解释的方式提高了可移植性。 3. **Java程序开发流程**: - 安装JDK并配置环境变量。 - 使用文本编辑器编写.java源代码文件。 ...

    Java程序的设计--复习要点说明.doc

    Java程序设计复习要点详解 Java语言作为一种广泛应用的高级编程语言,具有诸多显著特点。它以其简单性、面向对象的设计、跨平台的可移植性、多线程能力、强大的网络编程支持、高度的可靠性和安全性而著称。这些特性...

    JAVA线程高级-线程按序交替执行

    - Java的`Thread`类提供了设置线程优先级的方法,如`setPriority()`,但优先级并不保证绝对的执行顺序,只能影响调度概率,实际执行顺序依赖于JVM和操作系统。 7. **`Thread.yield()`**: - `Thread.yield()`方法...

    Java程序设计技术-期末复习.ppt

    5. **语句和表达式**:语句是程序执行的最小单元,如赋值语句、控制流语句等;表达式则用于计算结果,如算术表达式、方法调用表达式。 6. **公有类名与文件名**:Java中,一个公有类的文件名应与其类名相同,并且...

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

    以下是关于JAVA程序执行顺序的详细解释: 1. **静态块**: 静态块是在类加载时执行的,它不依赖于类的实例。在上述代码中,`Mastiff`类的静态块`static block`会在类被加载到JVM(Java虚拟机)时执行,这是在任何...

    Java语言程序设计 - 北邮

    在Java中,控制流程语句用于决定程序的执行顺序。例如,if-else语句用于条件判断,for、while和do-while循环则用于重复执行某段代码。此外,switch语句在多条件分支时也非常有用。 函数(或称方法)是Java中实现...

    JAVA程序设计基础-PPT课件.ppt

    Java程序设计基础是编程学习的重要部分,...总的来说,Java程序设计基础中的运算符和表达式是构建程序逻辑的基础,而流程控制语句则决定了程序执行的路径和方式,这两部分是学习任何编程语言都需要掌握的关键知识点。

    浙大-Java语言程序设计-第三讲.ppt

    通过这些知识点,我们可以理解Java程序的基本逻辑构造,从而编写能够根据条件进行不同操作的程序。掌握这些基础知识对后续深入学习Java编程至关重要,因为无论是简单的数据处理还是复杂的算法实现,都离不开这些基本...

    java程序初始化顺序

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

    JAVA语言程序设计-第十四章 多线程

    - Java线程有三个内置优先级:MIN_PRIORITY(1),NORM_PRIORITY(5),MAX_PRIORITY(10),但具体执行顺序依赖于JVM和操作系统。 9. **线程安全问题**: - 不正确的线程操作可能导致数据不一致,如无同步访问...

    JAVA语言程序设计-第三章 流程控制

    在JAVA语言程序设计中,流程控制是编程的基础概念,它决定了程序执行的顺序。本章主要探讨了如何通过不同的流程控制结构来实现条件判断、循环和复合语句,以达到控制程序逻辑的目的。 首先,流程控制包括顺序控制、...

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

    Java类的执行顺序是编程过程中一个非常重要的概念,特别是在深入理解...理解这些基础知识对于编写高效、可靠的Java程序至关重要,也是面试中常见的技术考察点。通过实例和流程图的辅助,我们可以更直观地掌握这些概念。

    JAVA课件---很快的掌握java语言

    控制流程语句(如if语句、for循环、while循环)则决定了程序的执行顺序。 Java的核心特性之一是它的面向对象特性。面向对象编程(OOP)强调通过类来封装数据和行为,通过继承来实现代码复用,通过多态来实现灵活的...

    mysql-connector-java-8.0.11.jar文件

    MySQL Connector/J是MySQL数据库与Java应用程序之间的桥梁,它是一个实现了JDBC(Java Database Connectivity)标准的驱动程序,允许Java开发者在Java应用中访问和操作MySQL数据库。`mysql-connector-java-8.0.11....

    Java软件开发实战 Java基础与案例开发详解 9-5 java程序国际化的实现 共9页.pdf

    2-1 java程序简介 2-2 计算机中的程序 2-3 java程序 2-4 java类库组织结构和文档 2-5 java虚拟机简介 2-6 java的垃圾回收器 2-7 java上机练习 3-1 java语言基础入门 3-2 数据的分类 3-3 标识符、关键字和常量 3-4 ...

    Java程序设计-4-流程控制.zip_控制 Java

    在Java编程语言中,流程控制是编写程序时不可或缺的一部分,它决定了代码的执行顺序和条件。本教程将深入探讨Java中的流程控制结构,包括顺序控制、选择控制(条件语句)和循环控制,帮助你更好地理解和运用这些概念...

    Java课程设计--简单记事本程序的设计.doc

    - **程序流程图** 用图形方式表示程序运行的逻辑流程,帮助理解程序的执行顺序。 - **程序相关说明** 可能包括对特殊功能或算法的详细解释,以及如何处理异常情况。 3. **程序详细设计与分析** - **初始化组件**...

    JAVA程序设计.pdf

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

    mysql-connector-java-5.1.36-bin.zip

    MySQL Connector/J就是实现了JDBC接口的驱动,使得Java程序能够与MySQL数据库进行连接、查询、更新等操作。 `mysql-connector-java-5.1.36-bin.jar`是这个驱动的二进制版本,包含了Java编译后的字节码。在使用前,...

Global site tag (gtag.js) - Google Analytics