网络编程 | 站长之家 | 网页制作 | 图形图象 | 操作系统 | 冲浪宝典 | 软件教学 | 网络办公 | 邮件系统 | 网络安全 | 认证考试 | 系统进程
Firefox | IE | Maxthon | 迅雷 | 电驴 | BitComet | FlashGet | QQ | QQ空间 | Vista | 输入法 | Ghost | Word | Excel | wps | Powerpoint
asp | .net | php | jsp | Sql | c# | Ajax | xml | Dreamweaver | FrontPages | Javascript | css | photoshop | fireworks | Flash | Cad | Discuz!
当前位置 > 网站建设学院 > 网络编程 > Java
Tag:注入,存储过程,分页,安全,优化,xmlhttp,fso,jmail,application,session,防盗链,stream,无组件,组件,md5,乱码,缓存,加密,验证码,算法,cookies,ubb,正则表达式,水印,索引,日志,压缩,base64,url重写,上传,控件,Web.config,JDBC,函数,内存,PDF,迁移,结构,破解,编译,配置,进程,分词,IIS,Apache,Tomcat,phpmyadmin,Gzip,触发器,socket
网络编程:ASP教程,ASP.NET教程,PHP教程,JSP教程,C#教程,数据库,XML教程,Ajax,Java,Perl,Shell,VB教程,Delphi,C/C++教程,软件工程,J2EE/J2ME,移动开发
本月文章推荐
.实用系统的架构主选:可伸缩性和.
.Eclipse插件之WebLogic Plugin 2.
.使用JMS在集群应用程序中分配任务.
.开发方法及软件工程之ANT之文件操.
.基于tomcat5.5的数据库连接池环境.
.Mini Java编译器(五).
.跨越边界: 活动记录和 Java 编程.
.J2EE应用部署(一):基础篇.
.J2EE的发展历程.
.对象的创建和存在时间.
.一个 Java 编程老手的设计语录.
.java读取操作系统环境变量.
.JDBC3.0 新特性.
.Java深入分析之:使用Factory Me.
.Java语言基础 三.
.Java Socket编程(二)Java面向连.
.Tapestry入门.
.参加4月4日BenWang的JBoss讲座纪.
.三步学会Java Socket编程.
.Java:Struts入门初步知识.

理解Java赋值和参数传递机制

发表日期:2008-1-5



  提纲:
1、版权声明
2、前言
3、正文
4、结论
5、附注
6、参考资料

=======================================================

1、版权声明:
  本文作者:little,原始出处:用"堆栈区数据复制"理解Java赋值和参数传递机制的心得 (http://java.learndiary.com/disDiaryContentAction.do?goalID=2716),邮件:mdx-xx@tom.com。如有任何反馈意见请联系作者,作者会在本文原始出处随时更新此文。转载及引用请保留此版权声明,谢谢。

2、前言:
  关于Java的赋值和参数传递是按值(by value)进行的还是按引用(by reference)进行的,这个问题曾经迷惑了很多人,包括我。而且,我想,这个问题还将继续迷惑一些人,包括那些C++的高手。
  在这里,我不预备用“按值(by value)”和“按引用(by value)”这样的术语来阐述这个问题。因为,从字面的理解来看,这样的术语在不同的人头脑里有不同的含义。我试图从Java数据(包括原始类型(primitive type)和对象(ojbect))在内存中的存储这个角度,用一个自创的“术语”来阐述我对这个问题的理解。这个术语就是:“堆栈区数据复制(Stack Data Copy,简称SDC)”。具体一点就是:在Java中,不管是赋值操作还是参数传递操作--针对原始类型(primitive type),是对堆栈区的原始类型的值进行复制;针对对象,是对储存在堆栈区的,对象的引用中所储存的对象的值的地址进行复制。
  像上面抠字眼的句子读起来比较费力,我在后面将用两个例子并结合一些示意图来阐述我对这个问题的理解。希望各位朋友帮助纠正错误。

3、正文:
1)、赋值操作:
例子源码:(Assign.java)
  1. public class Assign{
  2.   public static void main(String[] args){
  3.     int i = 1;
  4.     Object o = new Object();
  5.     System.out.println("i = " + i + " ; o = " + o ); // Step 1 (示意图:3-1-1)
  6.     int j = i;   
  7.     Object p = o;
  8.     System.out.println("i = " + i + " ; j = " + j + " ; o = " + o + " ; p = " + p); //Step 2 (示意图:3-1-2)
  9.     j++;
  10.     p = new Object();
  11.     System.out.println("i = " + i + " ; j = " + j + " ; o = " + o + " ; p = " + p); //Step 3 (示意图:3-1-3)
  12.   }
  13. }


对上面例子的说明:
(1),Step 1中,整数i和对象o得到赋值。

示意图3-1-1

理解Java赋值和参数传递机制(图一) 

从示意图3-1-1中可以看出:整数i存储在堆栈区(Stack);对象o的引用存储在了堆栈区,但是对象o的值却存储在了内存堆中(Heap),对象o的引用存储了对象o的地址。
Step 1在我的机器上的一次输出结果:
  1. i = 1 ; o = java.lang.Object@a90653


上一篇:Java SE 6之脚本引擎 让程序如虎添翼 人气:592
下一篇:Java世界的Ruby 人气:785
浏览全部Java的内容 Dreamweaver插件下载 网页广告代码 祝你圣诞节快乐 2009年新年快乐