Java中的传值与传引用

曾经对java中传值还是传引用的问题十分困惑,而且也被问到过许多次,无论是面试,还是平时我们平时的讨论中。

在stackoverflow上面浏览时,无意中发现了跟这个问题有关的论题,于是深入地查看了,感觉获益匪浅,于是结合自己过去的经验,写了这篇博客跟大家分享。

以前我觉得是这样的,java中的基本数据类型和String是传值的,而其它的类类型的数据则是传引用的。不过现在我觉得不是这样的。

*******************************************************************************

我觉得人们对于传值还是传引用的困惑源于这样一个事实:不同的人对于“引用”的定义理解不同。具有C++背景的人认为“引用”跟C++里面的引用是同一个概念,而具体C语言背景的人则认为“引用”具有“指针”的含义,等等。java中传值还是传引用取决于“引用”的含义。

 

Java中的传值是这样的:

 1 public void method1(int i){
 2     i++;
 3     System.out.println(i);  //5
 4 }
 5 public void method2(String s){
 6     s+="a";
 7     System.out.println(s);  //aa
 8 }
 9 
10 int i=4;
11 method1(i);
12 System.out.println(i);  //4
13 
14 String a="a";
15 method2(a);
16 System.out.println(s);//a
View Code

但是,在java中,总是传值的。难以理解的事实是:Java把对象当引用来传递,而这些引用则是以值的形式来传递的。即对象实参的引用在初始化方法形参的时候复制了一份实参的引用,而这个拷贝的引用同实参的引用指向同一个对象。

示例如下:

1 public void foo(Dog d) {
2   d.getName().equals("Max"); // true
3   d = new Dog("Fifi");
4   d.getName().equals("Fifi"); // true
5 }
6 
7 Dog aDog = new Dog("Max");
8 foo(aDog);
9 aDog.getName().equals("Max"); // true
View Code

示例中aDog.getName()将返回“Max”。当对象引用以值的形式来传递的时候,d在方法中并没有被覆盖。

否则的话,形如:

1 public void foo(Dog d) {
2   d.getName().equals("Max"); // true
3   d.setName("Fifi");
4 }
5 
6 Dog aDog = new Dog("Max");
7 foo(aDog);
8 aDog.getName().equals("Fifi"); // true
View Code

 

转载于:https://www.cnblogs.com/littlepanpc/p/3842219.html

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/359727.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

java高性能序列化_Java最佳实践–高性能序列化

java高性能序列化在使用Java编程语言时,我们将继续讨论与建议的实践有关的系列文章,我们将讨论并演示如何将对象序列化用于高性能应用程序。 所有讨论的主题均基于用例,这些用例源于电信行业关键任务超高性能生产系统的开发。 在阅读本文的…

linux进程属主6,20150917 Linux进程查看与管理以及作业管理

第一、基础知识MBR引导--内核--内核程序--》协调其它程序一般内核运行在硬件之上,各应用也在硬件之前1)OS的基本功能:文件系统、网络功能、进程管理、内存管理、驱动程序、安全功能以上为通用目的设置的程序。,程序指令数据,程序运…

在javaweb中通过servlet类和普通类读取资源文件

javaweb有两种方式读取资源文件 在Servlet中读取,可以使用servletContext,servletContext可以拿到web所有的资源文件,然后随便读,但是这种方法不常用,尽量少在Servlet中读取资源文件 在普通Java类中(DAO中&…

linux运行python脚本语句,如何在Linux下运行Python脚本

1、使用python的IDEL运行python如果你的Linux安装了python,CtrlAltT打开Terminal后输入指令:python,会出现>>>,这个时候就可以在里面输入python脚本开始运行了使用exit()退出python环境该环境下与MATLAB很像(1)查看python版本:python idle下面输…

数学图形(1.43)贝壳形曲线与鱼形曲线

贝壳形曲线 #http://curvebank.calstatela.edu/naturalcurves/slide7.jpgvertices 12000t from 0 to (2*PI)r 10*(0.7 2.6*cos(t) 1.3*pow(sin(90*t), 3))x r*sin(t) y r*cos(t) 鱼形曲线 #http://www.2dcurves.com/quartic/quarticfi.html vertices 1000 t from 0 to…

linux下编译ios,为iOS安装OpenCV

一,要求CMake 2.8.8 或者更高Xcode 4.2 或者更新二,从Git库取得最新的 OpenCV使用 git 客户端从 http://github.com/itseez/opencv clone Open 库。在 max os x 下,可以通过以下命令行完成cd ~/git clone https://github.com/Itseez/opencv…

学习使用资源文件[11] - DLL 中的资源文件

本例将把一张 bmp 图片, 以资源文件的方式嵌入 dll, 然后再调用.第一步: 建一个 DLL 工程, 如图:然后保存, 我这里使用的名称都是默认的.第二步: 建一个资源原文件, 如图:编辑内容如下(路径中的文件一定要存在):img1 BITMAP "c:\temp\test.bmp"然后, 取个名(后缀须是…

linux 自动安装 yum,LINUX6安装YUM仓库和实现开机自动挂载

# LINUX6安装YUM仓库和实现开机自动挂载---------------------------------安装环境-------------------------------Redhat6镜像文件:链接:https://pan.baidu.com/s/1DKH6adbrsipM-cTzH-wBgA 百度网盘 密码是hxcbVmware Workstation虚拟机工具&#x…

.NET Framework 4.0源代码

原文出处:http://blogs.microsoft.co.il/blogs/arik/archive/2010/07/12/step-into-net-framework-4-0-source-code.aspx 本文将向你展示如何配置Visual Studio 2010逐语句执行.NET Framework 4.0源代码。 为啥? 因为很酷。 因为能帮助调试。 你不仅能看到源代码…

高tps、低延迟_如何在不到1ms的延迟内完成100K TPS

高tps、低延迟马丁汤普森(Martin Thompson)和迈克尔巴克(Michael Barker)讨论了如何通过采用一种新的基础架构和软件方法来构建一种以不到1ms的延迟处理100K TPS的HPC金融系统。 一些技巧包括: 了解平台 建模领域 明…

linux 保留最近目录,Linux如何删除全部目录只保留最新修改的目录

1、查看数据盘在没有分区和格式化数据盘之前,使用 “df –h”命令,是无法看到数据盘的,可以使用“fdisk -l”命令查看。友情提示:若您执行fdisk -l命令,发现没有 /dev/sdb 表明您的云服务无数据盘,那么您无…

jqGrid Events

事件定义示例: var lastSel; jQuery("#gridid").jqGrid({ ... onSelectRow: function(id){ if(id && id!lastSel){ jQuery(#gridid).restoreRow(lastSel); lastSelid; } j…

linux cpu负载巡检,linux服务器巡检报告.doc

Linux服务器巡检设备Power Edge硬件配置信息机型号Power Edge R710CPU4颗 Intel? Xeon? CPU E5520 2.27GHz内存16G硬盘600G系统信息操作系统LINUX 2.6.18IP主机名(一)操作系统检查检查项检查操作参考标准巡检情况操作系统版本检查执行命令uname –a系统账户检查利用root身份…

数据结构课程设计题目十二_计算机学院学生会的打印机(优先队列)

本文出自:http://blog.csdn.net/svitter 题目12:计算机学院学生会的打印机(优先队列) 小明抱怨学生会的打印机不符合FIFO的原则,看到很多在他后面来打印的同学比他先打印出来。五分钟前,小明的文件就是下一个候选的&am…

gwt-2.8.2下载_GWT EJB3 Maven JBoss 5.1集成教程

gwt-2.8.2下载大家好, 在本文中,我们将演示如何正确集成GWT和EJB3 ,以实现示例项目,使用maven进行构建并将其部署在JBoss 5.1应用服务器上。 实际上,您可以轻松地更改maven构建文件中的依赖关系,并将项目部…

linux blender骨骼绑定,在Linux系统中安装开源3D创建套件Blender的方法

Blender是免费的开源3D创建套件,它可在Linux系统中安装,可使用snap或flatpak命令安装Blender。简介Blender也称为开源3D建模软件,支持整个3D管道,建模,装配,动画,模拟,渲染&#xff…

配置源码管理工具(2)

源码管理是开发中最重要的事情之一,在vs.net里我们通常采用vss进行版本控制,在Eclipse里看帖子说用svn的比例很大,和IDE的集成性也很好。 1:服务器部署 下载地址是:http://subversion.apache.org/packages.html 下载的…

编写下载服务器。 第六部分:描述您发送的内容(内容类型等)

就HTTP而言,客户端下载的只是一堆字节。 但是,客户真的很想知道如何解释这些字节。 它是图像吗? 或者也许是ZIP文件? 本系列的最后一部分描述了如何向客户端提示她下载的内容。 设置 内容类型描述了要返回的资源的MIME类型 。 此…

linux中vi过滤,vim高级编辑(一)

------------------------------------------------------------------------------------------------本文内容学习自《使用vi编辑器, Lamb & Robbins编著》本文内容概要:set设置.vimrc配置vim下执行linux命令利用linux命令来编辑当前文件短语缩写本…

ruby中的self

self,自己,在ruby中表示当前对象或默认对象。程序执行的任一时刻,有且仅有一个self。 1.谁成为self,在什么位置成为self? 要知道哪个对象是self,就必须知道当前的上下文。上下文主要有顶层上下文&#xff0…