【转】 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" ...
随机推荐
- LINUX-iostat命令讲解
语法如下:iostat [ -c | -d ] [ -k ] [ -t ] [ -V ] [ -x [ device ] ] [ interval [ count ] ]-c为汇报CPU的使用情况:- ...
- HighCharts实现多数据折线图分列显示
HighCharts实现多数据折线图分列显示 BY ZYZ HighCharts是一个很好用的web端绘图插件,用起来很方便,它的官方支持很好.并且有中文API(不全然).画出来的图像也挺美丽的. 近 ...
- Linux中SFTP命令
sftp和ftp是两种协议是不同的,sftp是ssh内含的协议,只要sshd服务器启动了,它就可用,它本身不需要ftp服务器启动. 1.常用登陆方式: 格式:sftp <user>@< ...
- Python selenium 滚动条 详解
在我们使用Python + selenium 爬虫的时候,会遇到如下报错,原因是 当页面上的元素超过一屏后,想操作屏幕下方的元素,是不能直接定位到,会报元素不可见的. selenium.common ...
- python标准库介绍——34 commands 模块详解
==commands 模块== (只用于 Unix) ``commands`` 模块包含一些用于执行外部命令的函数. [Example 3-7 #eg-3-7] 展示了这个模块. ====Exampl ...
- Shell脚本大量示例
Shell基础之控制流结构 一.控制结构 几乎所有的脚本里都有某种流控制结构,很少有例外.流控制是什么?假定有一个脚本,包含下列几个命令: #!/bin/sh # make a directory ...
- 四大Java EE容器(Tomcat、JBoss、Resin、Glassfish)之简单比较
转自:http://www.cxybl.com/html/bcyy/java/201106241007.html 现在流行的Java EE容器有很多:Tomcat.JBoss.Resin.Glassf ...
- 【iOS XMPP】使用XMPPFramewok(一):添加XMPPFramework(XCode 4.6.2)
转自:http://www.cnblogs.com/dyingbleed/archive/2013/05/09/3069145.html XMPPFramework GitHub: https://g ...
- centos7 开启特定的端口
systemctl是centos7的服务管理工具中主要的工具,它融合之前的service和chkconfig功能于一体; 开机时启动:systemctl enable firewalld.servic ...
- ssl与tls的差别
1)版本号:TLS记录格式与SSL记录格式相同,但版本号的值不同,TLS的版本1.0便 用的版 本号为SSLv3.1. 2) 报文鉴别码:SSLv3.0和TLS的MAC算法的范围不同,但两者的安全层度 ...