- 浏览: 83349 次
文章分类
- 全部博客 (136)
- 我的技术资料收集 (98)
- 具体技术 (1)
- 的技术资料收集 (4)
- All Articles (1)
- 机器学习 Machine Learning (1)
- 网络编程 (1)
- java (2)
- ava (1)
- 零散技术 (1)
- C# (3)
- 技术资料收集 (1)
- CQRS (1)
- 数据库技术(MS SQL) (1)
- .Net微观世界 (1)
- Oracle SQL学习之路 (1)
- C/C++ (1)
- JS/JQ (1)
- Js封装的插件/实例/方法 (2)
- 敏捷个人 (2)
- Javascript (1)
- 程序设计---设计模式 (1)
- Bug (1)
- 未知分类 (1)
- 程序设计 (1)
- Sharepoint (1)
- Computer Graphic (1)
- IT产品 (1)
- [06]JS/jQuery (1)
- [07]Web开发 (1)
- .NET Solution (1)
- Android (3)
- 机器学习 (1)
- 系统框架设计 (1)
- Others (1)
- 算法 (1)
- 基于Oracle Logminer数据同步 (1)
- 网页设计 (1)
- 原创翻译 (1)
- EXTJS (1)
- Jqgrid (1)
- 云计算 (1)
最新评论
所谓向前引用,就是在定义类、接口、方法、变量之前使用它们,例如,
{
void method()
{
System.out.println(myvar);
}
String myvar = "var value";
}
myvar在method方法后定义,但method方法可以先使用该变量。在很多语言,如C++,是需要提前定义的,而Java已经允许了向前引用。不过在使用向前引用时可能会容易犯一些错误。例如,下面的代码。
int method() {return n; }
int m = method();
int n = 1;
}
如果简单地执行下面的代码,毫无疑问会输出1.
不过使用下面的代码输出变量m,却得到0。
那么这是真么回事呢?
实际上,从java编译器和runtime的工作原理可以得知。在编译java源代码时只是进行了词法、语法和语义检测,如果都通过,会生成.class 文件。不过这时MyClass中的变量并没有被初始化,编译器只是将相应的初始化表达式(method()、1)记录在.class文件中。
当runtime运行MyClass.class时,首先会进行装载成员字段,而且这种装载是按顺序执行的。并不会因为java支持向前引用,就首先初始 化所有可以初始化的值。首先,runtime会先初始化m字段,这时当然会调用method方法,在method方法中利用向前引用技术使用了n。不过这 时的n还没有进行初始化呢。runtime为了实现向前引用,在进行初始化所有字段之前,还需要将所有的字段添加到符号表中。以便在任何地方(但需要满足 java的调用规则)都可以引用这些字段,不过由于还没有初始化这些字段,所以这时符号表中所有的字段都使用默认的值。int类型的字段默认值自然是0 了。所以在初始化int m = method()时,method方法访问的n实际上是在进行正式初始化之前已经被添加到符号表中的字段n,而不是后面的int n = 1执行的结果。但将MyClass改成如下的形式,结果就完全不同了。
int method() {return n; }
int n = 1;
int m = method();
}
现在执行下面的代码,会输出1.
究其原因,是引用初始化m时调用method方法,该方法中使用的n已经是初始化完的了,而不是最初放到符号表中的值。
综合上述,runtime在运行.class文件时,每个作用域(方法、接口、类等带语言元素都有自己的作用域)的符号表都会被至少访问两次,第一次会将 所有的字段(这里只考虑类的初始化)放到符号表中,暂时不考虑初始化只,放到符号表中只是相当于一个索引,好让其他地方引用该字段时可以找到它们,例 如,method方法中引用n时就会到符号表中寻找n,不过这时的n只是int类型的默认值。等到第二次访问n就是真正初始化n的时候(int n = 1)。这是将符号表中存储的字段n的值更新为实际的初始化值(1)。所以如果引用n放生在正式初始化n之前,当然输出的是0。
那么可能有人会问,先访问一下n,再访问m,这时m的值是否为1呢?答案仍然是0。因为在创建MyClass对象时m和n的初始化工作已经完成,它们的值已成事实,除非再次设置,否则不可改变了。
System.out.println(myClass.n); // 输出1
System.out.println(myClass.m); // 仍然输出0
对于静态成员,仍然符合这一规则。
static int method() {return n; }
static int m = method(); // 直接访问m,仍然会输出0
static int n = 1;
}
本文链接:http://www.cnblogs.com/nokiaguy/p/3156357.html,转载请注明。
发表评论
-
C#WebBrowser控件使用教程与技巧收集--苏飞收集 - sufeinet
2013-06-28 12:07 1063原帖地址:http://www.cnblogs.com/suf ... -
我要喷一个自认为很垃圾的网站架构 - 老赵【苏州】
2013-06-28 12:01 1122原帖地址:http://www.cnblogs.com/lao ... -
[翻译] Oracle Database 12c 新特性Multitenant - Cheney Shue
2013-06-28 11:43 618原帖地址:http://www.cnblogs.com/ese ... -
memcahd 命令操作详解 - 阿正-WEB
2013-06-28 11:37 467原帖地址:http://www.cnblogs.com/azh ... -
面向过程的代码符合大众的思维方式吗? - 史蒂芬.王
2013-06-27 10:28 588原帖地址:http://www.cnblogs.com/ste ... -
面向过程的代码符合大众的思维方式吗? - 史蒂芬.王
2013-06-27 10:28 554原帖地址:http://www.cnblogs.com/ste ... -
RPG游戏之组队测试 - zthua
2013-06-27 10:22 554原帖地址:http://www.cnblogs.com/zth ... -
IT人们给个建议 - SOUTHER
2013-06-26 14:06 521原帖地址:http://www.cnblogs.com/sou ... -
使用Func<T1, T2, TResult> 委托返回匿名对象 - 灰身
2013-06-26 13:54 795原帖地址:http://www.cnblo ... -
【web前端面试题整理03】来看一点CSS相关的吧 - 叶小钗
2013-06-25 10:45 781原帖地址:http://www.cnblogs.com/yex ... -
Windows 8 动手实验系列教程 实验6:设置和首选项 - zigzagPath
2013-06-25 10:27 614原帖地址:http://www.cnblogs.com/zig ... -
闲聊可穿戴设备 - shawn.xie
2013-06-25 10:21 560原帖地址:http://www.cnblo ... -
CentOS下Mysql安装教程 - 小学徒V
2013-06-23 15:24 605原帖地址:http://www.cnblogs.com/xia ... -
vmware安装ubuntu12.04嵌套安装xen server(实现嵌套虚拟化) - skyme
2013-06-23 15:18 832原帖地址:http://www.cnblogs.com/sky ... -
之前专门为IE6、7开发的网站如何迁移到IE10及可能遇到的问题和相应解决方案汇总 - 海之澜
2013-06-23 15:12 943原帖地址:http://www.cnblogs.com/wuz ... -
Android学习笔记--解析XML之SAX - 承香墨影
2013-06-23 15:01 405原帖地址:http://www.cnblo ... -
SQL Server 性能优化之——T-SQL TVF和标量函数
2013-06-19 09:32 666原帖地址:http://www.cnblogs.com/Boy ... -
Nginx学习笔记(二) Nginx--connection&request
2013-06-19 09:26 657原帖地址:http://www.cnblogs.com/cod ... -
从郭美美霸气侧漏看项目管理之项目经理防身术
2013-06-19 09:20 496原帖地址:http://www.cnblogs.com/had ... -
1、图解Oracle Logminer配置使用
2013-06-18 10:37 1605原帖地址:http://www.cnblogs.com/shi ...
相关推荐
20210127-银河证券-传媒互联网行业出海专题系列报告一:助力文化强国扬帆起航,游戏乘东风之势出海.pdf
### 国产系统-银河麒麟桌面版安装WPS 办公软件详解 #### 一、概览 本文档旨在提供一份详细的指南,帮助用户在银河麒麟桌面版操作系统中安装WPS办公软件。银河麒麟是一款基于Linux内核的操作系统,专为中国市场定制...
Java 7 OpenJDK Arm64 AArch64 压缩包文件“java-7-openjdk-arm64-aarch64.tar.gz”是专为基于ARM架构的64位系统设计的Java开发运行环境。这个压缩包包含了OpenJDK 7的实现,OpenJDK是一个开源版本的Java开发工具包...
国产系统-银河麒麟V10桌面版安装字体.pdf原版文档
根据给定的信息,本文将深入探讨“基金风格识别”的核心概念、分析方法及其应用实践,主要聚焦于银河证券发布的研究报告《银河金工FOF系列之十:基金风格识别》。 ### 一、基金的风格分类 基金风格是指基金在进行...
### 国产系统-银河麒麟桌面版安装WPS文档详解 #### 一、银河麒麟桌面版简介 银河麒麟操作系统是一款由中国电子集团主导研发的操作系统,它基于Linux内核,提供了安全可靠的桌面环境。银河麒麟桌面版V10(SP1)是其...
长城汽车是中国自主品牌的汽车领军企业之一,专注于SUV和皮卡领域,在国内及国际市场上拥有显著的市场占有率。公司的核心竞争力在于其全面的产业链布局、领先的汽车研发生产能力、持续的技术革新、产品创新及营销...
20150612-银河证券-沃森生物-300142-深度研究:最强生物药平台,期待价值重估.pdf
49--[银河反击战].zip源码scratch2.0 3.0编程项目源文件源码案例素材源代码49--[银河反击战].zip源码scratch2.0 3.0编程项目源文件源码案例素材源代码49--[银河反击战].zip源码scratch2.0 3.0编程项目源文件源码案例...
随着中国宠物经济的快速发展,宠物食品行业作为其中的一个重要分支,也呈现出蓬勃发展的态势。特别是国货宠物食品,正通过线上渠道的快速拓展和消费观念的转变,在市场中寻找到了突破的机会。本篇研究报告对国货宠物...
黑色金属衍生品日报-20190605-银河期货-27页.pdf
科创与改革共铸长牛-0710-银河证券-43页.pdf
从给定的文件信息中,我们可以提炼出以下IT行业知识点: 1. “双碳”政策:文件提到的“双碳”指的是我国提出的“碳达峰”与“碳中和”目标,这两个目标分别指在2030年前达到碳排放峰值,并在2060年前实现碳中和。...
20210523-银河证券-电力设备新能源行业周报:电池龙头加码上游布局,风光21年建设指引出台.pdf
科技行业:中国半导体行业,临危受命-5-银河国际-页.pdf
20210805-银河证券-旭辉永升服务-1995.HK-旭日东升,可持续的优质成长.pdf
泡泡玛特是一家以潮流玩具全产业链综合运营平台为核心业务的公司,主要通过艺术家挖掘、IP孵化运营、消费者触达以及潮玩文化推广与培育四个领域来驱动业务发展。公司成功打造了Molly、Pucky、Dimoo、The Monsters等...
零售行业:8月维持推荐核心组合-0801-银河证券-21页.pdf
宏观研究报告:猪周期下的CPI-0424-银河证券-14页.pdf