`
lganggang131
  • 浏览: 15021 次
  • 性别: Icon_minigender_1
  • 来自: 湖南
最近访客 更多访客>>
社区版块
存档分类
最新评论

java运行机制与执行顺序

阅读更多

package Test1229;
/**
 * java的运行机制与执行顺序
 *
 * */
class Name {
 Name() {
  Screen.print("8", "Name instance constructor!");
 }

 Name(String value) {
  Screen.print("9", "Name instance constructor with: " + value);
 }

 static {
  Screen.print("10", "Name static init block");
 }
 
 }

class Person {
 private Name name = new Name();
 static {
  Screen.print("5", "Person static init block!");
 }

 Person() {
  Screen.print("6", "Person instance constructor!");
 }

 {
  Screen.print("7", "Person instance init block!");
 }
}

public class Customer extends Person {
 static Name name = new Name("Tom");
 static {
  Screen.print("2", "Customer static init block!");
 }
 {
  Screen.print("3", "Customer instance init block!");
 }

 Customer() {
  Screen.print("4", "Customer instance constructor!");
 }

 public static void main(String[] args) {
  Screen.print("1", "Customer Initial Test!");
  Person p = new Customer();
 }
}

class Screen {
 static void print(String sn, String msg) {
  System.out.println("P[" + sn + "] - " + msg);
 }
}

/*你能直接说出它的运行结果是什么吗?

执行结果输出为:
P[5] - Person static init block!
P[10] - Name static init block
P[9] - Name instance constructor with: Tom
P[2] - Customer static init block!
P[1] - Customer Initial Test!
P[8] - Name instance constructor!
P[7] - Person instance init block!
P[6] - Person instance constructor!
P[3] - Customer instance init block!
P[4] - Customer instance constructor!

你回答是否正确呢?

为什么呢?

解释如下:
Java code { Screen.print("7", "Person instance init block!"); }
叫实例初始化块

Java code static{ Screen.print("2", "Customer static init block!"); }
叫静态初始化块


类加载优先级顺序为:

   static区(static初始化块和类static实例变量) > 类的非static初始化区(实例初始化块和实例变量) > 类构造函数
static区在第一次遇到该类时就被加载,非static区和构造函数在创建对象(既new)时加载。同一个类的多个static区之间按代码出现
的先后顺序加载,非static区亦然。static只加载一次,为类所有,不是为类对象所有。

该程序中:
1.进入Customer类,检查发现有extends,存在父类Person。
2.进入Person类,检查Person无父类存在,但有static区,执行输出"5"。因Person没被创建,所以非static区和Person构造函数不被加载。
3.进入Customer类程序体,发现有多个static区。   第一个为static Name name = new Name("Tom")。创建Name,进入Name类,加载Name静
    态初始化快,输出"10"。无非static区,  则加载相应构造函数,输出"9"。   第二个出现的static是"2",输出
4.进入main线程,运行第一行输出"1"
5.创建一个无参Customer()对象。因为Person类是其父类,创建子类时,系统必自动创建一个父类对象。
      再次进入Person类,按顺序先创建Name对象。进入Name类,其static区已被加载,不需要再加载。没有非static区。调用相应构造函数,
      输出"8",退出name类。加载Person类第二个非static区,输出"7",然后加载其构造函数输出"6",退出Person。
      进入Customer类,加载初始化块输出"3",然后是构造函数输出"4"
6.退出main线程

*/

 

分享到:
评论

相关推荐

    javascript运行机制之执行顺序理解

    如果你不能理解javaScript语言的运行机制,或者简单地说,你不能掌握javascript的执行顺序,那你就犹如伯乐驾驭不了千里马,让千里马脱缰而出,四处乱窜。  那么JavaScript是怎么来进行解析的吗?它的执行顺序又是...

    Java开发技术大全(500个源代码).

    localVSmember.java 局部变量与成员变量同名问题示例 onlyTest.java 对象传值示例 otherClass.java 从类的外部访问对象的成员 showInstVar.java 演示不同的对象拥有不同的成员变量 showMain.java 演示main方法...

    java基础案例与开发详解案例源码全

    2.6 Java技术两种核心运行机制29 2.7 上机练习30 第3章 3.1 变量32 3.1.1 什么是变量32 3.1.2 为什么需要变量32 3.1.3 变量的声明和赋值33 3.1.4 变量应用实例33 3.2 数据的分类34 3.2.1 Java中的八种基本数据类型34...

    疯狂JAVA讲义

    1.3 Java程序运行机制 5 1.3.1 高级语言的运行机制 6 1.3.2 Java程序的运行机制和JVM 6 1.4 开发Java的准备 7 1.4.1 安装JDK 8 学生提问:不是说JVM是运行Java程序的虚拟机吗?那JRE和JVM的关系是怎样的呢? 8 ...

    其实你应该这样学Java 源代码

    第一部分讲解了Java的基本特点和运行原理,Java虚拟机和JDK+JCreator的开发环境,Java程序代码的特点,Java语言中的运算符和表达式,Java的基本数据类型,Java语句流程,如顺序语句、选择语句、循环语句、跳转语句等...

    Java2实用教程.rar

    12 1JavaApplet的运行原理 12 2网页向JavaApplet传值 12 3JavaApplet扣使用URL 12 4JavaApplet中建立新线程 12 5JavaApplet中使用套接字 习题 第13章常见数据结构的Java实现 13 1链表 13 2栈 13 3树集 13 4树映射 13...

    JAVA基础课程讲义

    Java运行时环境JRE(Java Runtime Environment) 17 JAVA语言应用范围 18 第一个JAVA程序 18 JAVA开发环境搭建 18 一个典型的JAVA程序的编写和运行过程 19 第一个程序常见错误 20 第一个JAVA程序的总结和提升 20 常用...

    JAVA入门1.2.3:一个老鸟的JAVA学习心得 PART1(共3个)

    4.1 顺序执行 67 4.2 使用if-else让程序懂得判断 68 4.2.1 if语句 68 4.2.2 if语句的嵌套 71 4.2.3 if-else语句 73 4.2.4 if-else语句嵌套 75 4.3 使用while进行循环 76 4.3.1 使用while语句 76 4.3.2 使用...

    Java入门1·2·3:一个老鸟的Java学习心得.PART3(共3个)

    4.1 顺序执行 67 4.2 使用if-else让程序懂得判断 68 4.2.1 if语句 68 4.2.2 if语句的嵌套 71 4.2.3 if-else语句 73 4.2.4 if-else语句嵌套 75 4.3 使用while进行循环 76 4.3.1 使用while语句 76 4.3.2 使用...

    Java虚拟机类加载机制浅谈

     虚拟机将描述类的数据从Class文件加载到内存,并对数据进行校验、准备、解析和初始化,终会形成可以被虚拟机使用的Java类型,这是一个虚拟机的类加载机制。Java中的类是动态加载的,只有在运行期间使用到该类的...

    JAVA--达内培训笔记

    java语言是先编译后解释,java源码是通过编译生成一种特殊的.class的中间字节码文件,然后再由JVM进行解释运行。 (编译) (解释) .java ----> .class ---> 可执行文件 所以效率低,是C++的20倍 5、java源...

    基于Java的视频会议系统(软件程序+WORD论文文档).zip

    RTP本身并不能为按顺序传送数据包提供可靠的传送机制,可不提供流量控制或拥塞控制,它依靠RTCP提供这些服务。 2.2.2 JAVA 网络编程技术 网络编程的目的就是指直接或间接地通过网络协议与其他计算机进行通讯。网络...

    java 面试题 总结

    Servlet被服务器实例化后,容器运行其init方法,请求到达时运行其service方法,service方法自动派遣运行与请求对应的doXXX方法(doGet,doPost)等,当服务器决定将实例销毁的时候调用其destroy方法。 与cgi的区别...

    Java SE练习代码总结 Java学习资料

    二维数组,可以看成一维数组array1作为另一个一维数组array2元素而存在,从数组底层运行机制来看,其实没有多维数组。 二维数组的元素存放的是各个一维数组的地址值,引用。 Arrays工具类的使用 public static ...

    Java 语言基础 —— 非常符合中国人习惯的Java基础教程手册

    运行结果为: C:\java UsingObject a point : x = 0 y = 0 **** after moving ***** Get x and y directly x = 50 y = 50 or Get x and y by calling method x = 50 y = 50 I like this point!!!! a new point : x =...

    AIC的Java课程1-6章

     [*]了解Java内存机制:栈、堆、常量池等,理解垃圾回收机制。 第3章 面向过程(数组和方法) 4课时  理解如何声明数组、构造数组、初始化数组以及使用数组中的各个元素。  清楚数组作为...

    关于java中package的设置

    (importing)动作的存在理由,也是为了提供命名空间(name space)的管理机制。所有的class成员名劫被互相隔绝。class A的 函数f(),其名称不会和class B()中具有相同标记式的f()相冲突。与此相类似,为了不使...

    Java2核心技术.part5

    1. 3 Java与Internet 1. 4 Java发展简史 1.5关于Java的常见误解 第2章Java程序设计环境 2.1安装Java开发工具箱 2.1.1下载JDK 2.1.2设置执行路径 2.1.3安装库源代码和文档 2.1.4安装本书中的示例 ...

    Java面试宝典-经典

    11、有数组a[n],用java代码将数组元素顺序颠倒 80 12.金额转换,阿拉伯数字的金额转换成中国传统的形式如:(¥1011)->(一千零一拾一元整)输出。 81 三. html&JavaScript&ajax部分 82 1. 判断第二个日期比第一...

Global site tag (gtag.js) - Google Analytics