【转】 Java中的变量赋值和参数传递
原文地址:http://blog.csdn.net/whmii/article/details/3363667
变量赋值和参数传递是java中两个容易让人迷惑的问题。
对于原始类型(primitives type),java采用值传递,这很明显。然而,当传递的参数类型是对象时,或者两个对象的变量进行赋值时,问题就有些复杂,很多初学者对此感到迷惑。
实际上,当赋值或者传递参数的时候,Java采取的都是一种值传递。
在下面的代码中,
- class A{
- int i=2;
- }
- class B{
- static void change(A a){
- a.i=31;
- }
- public static void main(String[] arguments){
- A a1=new A();
- A a2=new A();
- change(a1);
- System.out.println("a1: "+a1.i+"/na2: "+a2.i); // a1=31,a2=2;
- a1=a2;
- System.out.println("a1: "+a1.i+"/na2: "+a2.i); // a1=2,a2=2;
- }
- }
当执行change(a1)时,JVM将a1复制一份传递给A的静态函数change(A
a)中的参数a,注意这里a1和a都是对象的引用,而不是对象本身。所以,传递的是对象引用的复制品。从而a1和a变成同一个对象的两个不同引用。因此,通过a1对对象的改变,和通过a对对象的改变,具有同样的效果。打个比方,有一道带有复杂无比的锁的门(对象),这扇门有一把钥匙(a1)。现在,另外一个人会开此门(方法change()的定义),他有一把想象中的钥匙(形参),但他没有事实上的钥匙。当此人需要开此门时,怎么办?他需要一把钥匙,而主人传给他的确实是一把钥匙,只不过这把钥匙是主人原先的钥匙的复制品!而这个复制品显然也能打开这扇复杂的门。
同样,对于第13行的
a1=a2;
是这样进行的:复制前,a1和a2分别是两个不同对象的引用,当赋值时,a2的值赋给a1,结果a1的值和a2的值相等,a1变成a2所引用的对象的另一个引用,即a1和a2变成同一个对象的引用,而这个对象是原先a2引用的对象。原先a1引用的对象则因为失去了所有的引用而被垃圾收集器处理掉!
【转】 Java中的变量赋值和参数传递的更多相关文章
- Java中的变量与变量的作用域
关于Java中的变量及变量的作用域 关于Java中的变量及变量的作用域 0. 变量的概念 在程序运行期间,系统可以为程序分配一块内存单元,用来存储各种类型的数据.系统分配的内存单元要使用一个标记符来标 ...
- 004 java中的变量
这篇文章为你搞懂三个问题 什么是变量? 如何使用变量? 变量命名有哪些规范? 变量 计算机的内存类似于人的大脑,电脑使用内存来存储计算所需要的数据. 内存像旅馆一样,不同的房间类型对应不同的数据类型, ...
- Java中的变量——通过示例学习Java编程(4)
作者:CHAITANYA SINGH 来源:https://www.koofun.com/pro/kfpostsdetail?kfpostsid=14&cid= 变量是用来存放可以更改的值的容 ...
- java中的变量和数据类型
变量和javascript的变量含义一样 在Java中,变量分为两种:基本类型的变量和引用类型的变量.(javascript中同样是这样的) 基本数据类型 基本数据类型是CPU可以直接进行运算的类型. ...
- 学习笔记--Java中的变量
Java中的变量 /** * 关于 Java 语言当中的变量: * * 1. 什么是变量? * - 变量的本质上来说是内存空间,这块空间有(数据类型.名字.字面值) * - 变量包括三部分:数据类型. ...
- java中打印变量地址
在java中打印变量的地址 这个代码是在startoverflow上看到的,跟大家分享一下. import sun.misc.Unsafe; import java.lang.reflect.Fiel ...
- Java中静态变量与实例变量
知识回顾 上一篇总结了java中成员变量和局部变量的区别,这一篇将总结静态变量和实例变量的一些特性和区别. 示例代码 package Variable; public class VariableDe ...
- Java中关于变量的几种情况
Java中关于变量的几种情况 1.继承时变量的引用关系 class Animals { int age = 10; void enjoy() { System.out.println("An ...
- Java中静态变量的声明位置
Java中静态变量只能是成员变量,局部方法中的局部变量除final外不能有任何其他修饰符,例如: public class Test { static String x = "1" ...
随机推荐
- 【struts2】名为dispatcher的ResultType
1)基本使用 名称为“dispatcher”的ResultType,在struts-default.xml里的配置如下: <result-type name="dispatcher&q ...
- shell value too great for base
今天同步文件的时候发现了这个问题: 原因是: tar_file_month=`date +%m` rsync -auzq --exclude=))"]" 当月是8月,tar_fil ...
- /usr 的由来及/usr目录结构 [转]
一直好奇包罗众多程序的usr目录为什么叫usr呢?usr到底是什么的缩写,终于找到比较靠谱的答案了 /usr 的由来及/usr目录结构 作者 AN SHEN| 发布于 2011-11-05 在 lin ...
- MySql 按周/月/日统计数据的方法
知识关键词:DATE_FORMAT select DATE_FORMAT(create_time,'%Y%u') weeks,count(caseid) count from tc_case gro ...
- css冻结列的效果
<!DOCTYPE html><html lang="zh-cn"><head><meta charset="utf-8&quo ...
- win764bit系统plsqldeveloper11连接oracle11g64bit配置方法
win764bit系统plsqldeveloper11连接oracle11g64bit配置方法: 原因:plsqldeveloper都是32位的没有64位的程序 准备工作: 1,先要下载instant ...
- keepAlive参数详解
最近研究netty5.0中 发现http例子里面有关于KeepAlive的处理,于是研究了下 http://www.nowamagic.net/academy/detail/23350305
- [na]计算机网络性能指标(延迟/吞吐量/RTT等)
参考 计算机网络性能指标 计算机网络性能指标 带宽.速率.延迟.吞吐量.丢包率(无线验收标准一般-75dbm,del<100ms,丢包率3%) 带宽x延迟 决定着路上的数据的多少. 速率: 连接 ...
- Java 里如何实现线程间通信
正常情况下,每个子线程完成各自的任务就可以结束了.不过有的时候,我们希望多个线程协同工作来完成某个任务,这时就涉及到了线程间通信了. 本文涉及到的知识点:thread.join(), object.w ...
- 我的IT之路2013(二)
严寒即将过去,温暖的春天正在向我们招手,欢呼吧,在迎接新的开始的同时,不要忘了回顾一下过去的这一年,总结一下过去的这一年有什么得失. 英语学习 13年下半年,最大的变化就是有很大一部分时间用来学英语. ...