先复制一个面试/笔试的题:

当一个对象被当作参数传递到一个方法后,此方法可改变这个对象的属性,并可返回变化后的结果,那么这里到底是值传递还是引用传递?

答案:

是值传递。Java语言的方法调用只支持参数的值传递。当一个对象实例作为一个参数被传递到方法中时,参数的值就是对该对象的引用。对象的属性可以在被调用过程中被改变,但对对象引用的改变是不会影响到调用者的。C++和C#中可以通过传引用或传输出参数来改变传入的参数的值。在C#中可以编写如下所示的代码,但是在Java中却做不到。

java中的按值传递和按址传递(按引用传递),要明白这两个概念,要理解按值和按址。

下面举个简单的例子来说明:

比如你去国外旅行,拍了一张特别好的照片,你想分享给你的朋友,那么有两种方式,第一种是你直接将这个照片发送给你的朋友,也就是给你朋友这个照片的副本;第二种是假如你将这张及其好的照片上传到一个QQ(微博)等,你将会得到一个访问这个照片的地址(Url),此时在将这个url分享给你的朋友。

如上例子,第一种可以认为是按值传递,第二种可以认为是按址传递(按引用传递)。知道了这个概念。在进行下面的简单分析。

  • 按值传递:只有当参数为基本类型变量的时候,java按这种策略的方式传递。

    上面的分享照片,你的朋友拿到的照片是你的副本,那么朋友对照片的修改不会影响你的照片,你对照片的修改也不会影响到你给朋友分享的照片。

  • 按址传递:只有当参数为引用类型变量,java按这种策略方式进行传递。

    上面的Url地址给朋友,那么如果朋友也有修改的权限,朋友对照片进行操作,自己访问的照片就是朋友操作结果后的结果。

下面通过代码来解释这个例子:

  1. package com.dufy.reforvalue;
  2. import java.util.Arrays;
  3. /**
  4. * java中 按值传递和按址传递
  5. * 按值传递:基本类型变量-按值传递,按值传递通过复制获取参数的副本
  6. * 按址传递:引用类型变量-按址传递,按址传递通过传递对象的引用地址
  7. *
  8. * @author dufy
  9. * @creation 2017年2月9日
  10. */
  11. public class ReferenceOrValue {
  12. /**
  13. * 基本类型,按值传递
  14. * 举例:给朋友分享你的照片,对方接收的是你的照片的一个实际的副本,
  15. * 你和朋友分别对各自的照片进行操作,不会影响彼此的照片!
  16. */
  17. public static void testVal(int photo){
  18. photo++;//朋友对照片进行修改
  19. System.out.println("My friend see photo = " + photo);
  20. }
  21. /**
  22. * 引用类型:按址传递
  23. * 举例:给朋友分享你的照片,分享的是你上传网上的一个照片的Url(地址),
  24. * 你和朋友都可以通过这个地址访问照片,并对照片进行一个操作!
  25. */
  26. public static void testRef(Photo photo){
  27. photo.setPhoto("java Photo,Great!");//朋友对你的照片进行修改
  28. System.out.println("My friend see photo = " + photo.getPhoto());
  29. }
  30. /**
  31. * 引用类型:按址传递
  32. * 因为数组是一个引用类型。所以传递进去的是它们的引用,故在方法中互换了它们的值,也必然影响到它们原来的值.
  33. */
  34. public static void testArrayRef(int[] array){
  35. for (int i = 0; i < array.length; i++) {
  36. array[i] = 0;
  37. }
  38. System.out.println("testArrayRef array is = "+Arrays.toString(array));
  39. }
  40. public static void main(String[] args) {
  41. //一:按值传递
  42. int photo = 10;//定义要发送的照片
  43. testVal(photo);//将照片发发送你朋友,朋友得到的是一个副本
  44. System.out.println("My see photo = " + photo);
  45. //二:按址传递
  46. Photo p = new Photo();//定义一个照片的对象,我自己拍摄的java photo
  47. p.setPhoto("java photo");
  48. testRef(p);//将照片对象(即 Url地址) 发送你朋友,朋友得打的是一个Url(地址),Url打开才是照片
  49. System.out.println("My friend see photo = " + p.getPhoto());
  50. //三:数组也是对象,数组在堆内存。引用是在栈。
  51. int array[] = {1,2,3,4,5};
  52. testArrayRef(array);
  53. System.out.println("array is = "+Arrays.toString(array));
  54. }
  55. /**
  56. * 照片类
  57. */
  58. static class Photo{
  59. String photo;
  60. public String getPhoto() {
  61. return photo;
  62. }
  63. public void setPhoto(String photo) {
  64. this.photo = photo;
  65. }
  66. }
  67. }

输出的结果如下:

  1. My friend see photo = 11
  2. My see photo = 10
  3. My friend see photo = java Photo,Great!
  4. My friend see photo = java Photo,Great!
  5. testArrayRef array is = [0, 0, 0, 0, 0]
  6. array is = [0, 0, 0, 0, 0]

小插曲:有下下面这一道题:这个method应该怎么写呢?

  1. public static void main(String[] args) {
  2. int a = 10;
  3. int b = 20;
  4. method(a,b);//需要在method被调用后,仅打印出a=100,b=200,请写出method(a,b)方法!
  5. System.out.println("a = " + a);
  6. System.out.println("b = " + b);
  7. }

肯定有很多人和我之前一样,想都没想就写出下面的代码:

  1. private static void method(int a, int b) {
  2. a*=10;
  3. b*=10;
  4. }

但是运行结果后你会发现,没有打印出理想的结果!

这时候如果你仔细看来了上面的介绍就不难理解为什么会出现这样的结果了!

给出这道题可能正确的结果:

  1. private static void method(int a, int b) {
  2. System.out.println("a=100,b=200");
  3. System.exit(0);
  4. }

你觉得正确的答案是什么,可以给我留言和评论,欢迎讨论!

java到底是值传递还是引用传递? 知乎:https://www.zhihu.com/question/31203609

你会swap吗,按值传递还是按引用?:http://www.cnblogs.com/foreach-break/p/call-by-reference-OR-call-by-value.html


欢迎访问我的csdn博客,我们一同成长!

"不管做什么,只要坚持下去就会看到不一样!在路上,不卑不亢!"

http://blog.csdn.net/u010648555

java学习——java按值传递和按址传递的更多相关文章

  1. [Java学习] Java虚拟机(JVM)以及跨平台原理

    相信大家已经了解到Java具有跨平台的特性,可以“一次编译,到处运行”,在Windows下编写的程序,无需任何修改就可以在Linux下运行,这是C和C++很难做到的. 那么,跨平台是怎样实现的呢?这就 ...

  2. Java学习笔记-按值传递

    参数的值传递 实参必须与方法中次你故意的参数在次序和数量上匹配,在类型上兼容.类型兼容是指不需要经过显式的类型转换,实参的值就可以传递给形参.如将int型的实参值传递给double型形参. 当调用方法 ...

  3. java学习——java中的反射学习笔记

    Java--reflect 一.Class类的使用 什么是Class类? 1:在面向对象的世界中,万事万物皆对象. java语言中,静态的成员,普通数据类型类是不是对象呢? 是,对象!是类的对象! 类 ...

  4. 【转】Java学习---Java Web基础面试题整理

    [原文]https://www.toutiao.com/i6592359948632457731/ 1.什么是Servlet? 可以从两个方面去看Servlet: a.API:有一个接口servlet ...

  5. [Java学习] Java异常处理基础

    Java异常是一个描述在代码段中发生的异常(也就是出错)情况的对象.当异常情况发生,一个代表该异常的对象被创建并且在导致该错误的方法中被抛出(throw).该方法可以选择自己处理异常或传递该异常.两种 ...

  6. Java学习---Java代码编写规范

    编码规范 1 前言为确保系统源程序可读性,从而增强系统可维护性,java编程人员应具有基本类似的编程风格,兹制定下述Java编程规范,以规范系统Java部分编程.系统继承的其它资源中的源程序也应按此规 ...

  7. Java学习----Java概述

    一.常用DOS命令 d:      盘符切换 dir(directory)  列出当前目录下的文件以及文件夹 md (make directory)  创建目录 rd (remove director ...

  8. JAVA学习-JAVA环境准备

    dir:列出当前目录下的文件以及文件夹md:  创建目录rd:  删除目录cd: 进入指定的目录,打开文件夹cd..:退回到上一级目录cd/或cd\:退回到根目录del:删除文件d: : 切换到D盘根 ...

  9. JAVA学习.java.sql.date 与java.util.date以及gettime()方法的分析

    java.sql.Date 是针对SQL语句使用的,它只包含日期而没有时间部分. java.util.Date 就是在除了SQL语句的情况下面使用. 它都有getTime方法返回毫秒数,返回的是自19 ...

随机推荐

  1. 线性代数-矩阵-转置 C和C++的实现

    原理解析: 本节介绍矩阵的转置.矩阵的转置即将矩阵的行和列元素调换,即原来第二行第一列(用C21表示,后同)与第一行第二列(C12)元素调换位置,原来c31与C13调换.即cij与cji调换 . (此 ...

  2. 中了J.Fla的毒!

    中了J.Fla的毒!中了J.Fla的毒!中了J.Fla的毒!中了J.Fla的毒!中了J.Fla的毒!中了J.Fla的毒!中了J.Fla的毒!中了J.Fla的毒!中了J.Fla的毒!中了J.Fla的毒! ...

  3. 手工删除crfclust.bdb文件

    环境:RHEL 6.5 + Oracle 11.2.0.4 RAC 现象:巡检发现自己的测试环境节点2的空间使用率过高,进一步查询,发现大文件是GI目录下crfclust.bdb文件. crfclus ...

  4. matlab-常用函数(3)

    matlab取整函数: floor() floor()函数为向下取整函数,如下: floor(0.5) ans= 0 floor(-0.5) ans= -1 ceil() ceil()函数为向上取整, ...

  5. ActiveMQ笔记——技术点汇总

    目录 · Introduction to ActiveMQ · Installing ActiveMQ · Message-oriented middleware · JMS specificatio ...

  6. MYSQL 中 LIMIT 用法

    mapper文件中的sql: ------------------------------------------------------------------------------------- ...

  7. JAVA实用案例之图片水印开发

    写在最前面 上周零零碎碎花了一周的时间研究水印的开发,现在终于写了个入门级的Demo,做下笔记同时分享出来供大家参考. Demo是在我上次写的 JAVA实用案例之文件导入导出(POI方式) 框架基础上 ...

  8. chrome开发工具指南(十一)

    检查资源 使用 Application 面板的 Frames 窗格可以按框架组织资源. 您也可以在 Sources 面板中停用 Group by folder 选项,按框架查看资源. 要按网域和文件夹 ...

  9. poj 3013 SPFA

    首先看题看的很懵.. 然后这题直接没想用Djstra做 TLE了.看discuss,Dijstra要用堆优化,也可以用SPFA做. 这里在网上找了这两种做法的区别,点多稠密图用Dij,以为它是操作点的 ...

  10. Bootstrap框架菜鸟入门教程

    Bootstrap菜鸟入门教程 Bootstrap简介 Bootstrap,来自 Twitter,是目前最受欢迎的前端框架.Bootstrap 是基于 HTML.CSS.JAVASCRIPT 的,它简 ...