Java 方法参数传递

- 在编程语言中,方法对于参数的调用分为 按值调用(call by value) 和 按引用调用(call by reference).
- 按值调用(call by value):方法接收的是调用者提供的值.
- 按引用调用(call by reference):方法接收的是调用提供的变量地址.
- Java 程序设计语言总是采用 按值调用(call by value).
- 引用《Java 核心技术卷1》

在 Java 中方法参数的传递总是 按值调用(call by value) 的。也就是说方法得到的是所有参数值的一个拷贝,方法不能修改传递给它的任何参数变量的内容。然而有时候这与我们所看到的不太一样。

在 Java 中方法参数共有两种类型:

基本数据类型(数值、字符、布尔);
对象引用

基本数据类型

public class ParamTest {public static void main(String[] args){double num = 10.0;System.out.println("Before... --> num = "+num);quadruple(num);System.out.println("After... --> num = "+num);System.out.println("--------------********----------------------");double a = 20.0;double b = 15.0;System.out.println("Before... --> a = "+a+",b = "+b);swap(a,b);System.out.println("After... --> a = "+a+",b = "+b);}public static void quadruple(double num){num*=4;System.out.println("quadruple...--> num = "+num);}public static void swap(double a,double b){double c = a;a = b;b = c;System.out.println("swap...--> a = "+a+",b = "+b);}
}

上面代码中方法 quadruple()在方法内部将参数num放大了四倍,swap() 方法试图将两个变量的值进行调换。

Before... --> num = 10.0
quadruple...--> num = 40.0
After... --> num = 10.0
--------------********----------------------
Before... --> a = 20.0,b = 15.0
swap...--> a = 15.0,b = 20.0
After... --> a = 20.0,b = 15.0

从运行结果来看,变量numab都没有发生改变。这是因为 基本数据类型传递过去的都是 值 的拷贝,所以方法内部无论怎么修改变量的值都不会对外部变量产生影响。

对象引用

package com.yun;public class ObjParamTest {public static void main(String[] args) {Student stu = new Student("晓风","软件");System.out.println("Before... --> stu = "+stu);change(stu);System.out.println("After... --> stu = "+stu);System.out.println("--------------********----------------------");Student stu1 = new Student("春雨","电子");Student stu2 = new Student("夏雷","幼教");System.out.println("Before... --> stu1 = "+stu1+",stu2 = "+stu2);swap(stu1,stu2);System.out.println("After... --> stu1 = "+stu1+",stu2 = "+stu2);}public static void change(Student stu){stu.setName("秋风");stu.setMojar("汽修");System.out.println("change...--> stu = "+stu);}public static void swap(Student s1,Student s2){Student t = s1;s1 = s2;s2 = t;System.out.println("swap...--> s1 ="+s1+",s2 = "+s2);}
}
class Student {private String name;private String mojar;public Student(String name,String mojar){this.name = name;this.mojar = mojar;}/** Getter / Setter **/@Overridepublic String toString(){return "Studnet["+"name = "+name+",mojar = "+mojar+"]";}
}

上面代码中,change()方法对 stu 变量的信息进行了修改并输出,swap()方法依旧是将两个变量进行交换,如果依照 基本数据类型 一样,那么所有的对象引用将不会发生改变,然而事情并不是像我们想的那样:

Before... --> stu = Studnet[name = 晓风,mojar = 软件]
change...--> stu = Studnet[name = 秋风,mojar = 汽修]
After... --> stu = Studnet[name = 秋风,mojar = 汽修]
--------------********----------------------
Before... --> stu1 = Studnet[name = 春雨,mojar = 电子],stu2 = Studnet[name = 夏雷,mojar = 幼教]
swap...--> s1 =Studnet[name = 夏雷,mojar = 幼教],s2 = Studnet[name = 春雨,mojar = 电子]
After... --> stu1 = Studnet[name = 春雨,mojar = 电子],stu2 = Studnet[name = 夏雷,mojar = 幼教]

可以看到,change()方法竟然成功修改了变量stu。既然 Java 总是按值传递的,那为什么这里对象引用有成功被修改了呢?是不是说 Java 对象引用是按引用传递的呢?答案肯定是不可能的,因为可以看到swap()方法依旧没能调换两个变量的值。

change()方法为什么能够改变对象引用的状态呢,这是因为 Java 中对象引用传递的是 地址值,当两个变量同时只向同一个 地址时,也就是说两个对象引用在操作一个对象。我认为它就像将一个对象变量赋值给另一个对象变量:

Student shily = new Student("Shily","Java");
Student stu = shily;

这里stu的状态发生改变,shily的状态跟着改变,这就相当于change()方法。swap()方法就像:

Student shily = new Student("Shily","Java");
Student stu = shily;
Student darn = new Student("Darn","C++");
stu = darn;

此时 变量stu又重新指向了darn的地址,然而这并不会对变量shily产生任何影响。

在对象引用中,还有一个特殊的对象 String

String

public class ObjParamTest {public static void main(String[] args) {String str = "original";System.out.println("Before... --> str = "+str);change(str);System.out.println("After... --> str = "+str);}public static void change(String str){str = "change...";System.out.println("change...--> str = "+str);}
}
Before... --> str = original
change...--> str = change...
After... --> str = original

String 类并没有发生改变,String类像基本类型一样。

总结:

  • 一个方法不能修改一个基本数据类型的参数
  • 一个方法可以改变一个对象参数的状态
  • 一个方法不能让对象参数引用一个新的对象

Java 方法参数传递相关推荐

  1. java list作为参数传递_Java 程序将lambda表达式作为方法参数传递

    Java 程序将lambda表达式作为方法参数传递 在此示例中,我们将学习将lambda表达式作为Java中的方法参数传递. 要理解此示例,您应该了解以下Java编程主题: 示例1:将lambda表达 ...

  2. Java实验方法参数传递与递归_4.3类的结构之二:方法(return,重载,可变个数形参,值传递,递归)...

    类的设计中,两个重要结构之二:方法 * 方法:描述类应该具有的功能. * 比如:Math类:sqrt()\random()\ .. * Scanner类:nextXxx() .. * Arrays类: ...

  3. java方法的参数传递规则_java语言参数传递介绍

    java语言参数传递介绍 Java不只是一种编程语言,它是一个完整的平台,拥有庞大的库,将诸如图形绘制.Socket连接.数据库存取等复杂操作进行了最大程度的简化.下面是小编分享的java语言参数传递 ...

  4. 【Java】探究Java方法的参数传递是值传递还是引用传递

    测试思路 每个更改形参的方法,返回值都是void,不同方法的参数设置不同类型. 注意在方法内测地址的时候在改之前测一下,才能看出传入参数是不是传了地址.(注意反正OS的内存地址是虚拟的,JVM中的也是 ...

  5. java 方法当参数_如何在Java中将函数作为参数传递?

    如何在Java中将函数作为参数传递? 这个问题在这里已有答案: Java Pass方法作为参数                                     14个答案 是否可以将方法作为参 ...

  6. java.函数参数太多,Java方法参数太多怎么办—Part 2—引入参数对象,javapart

    Java方法参数太多怎么办-Part 2-引入参数对象,javapart 目录 自定义类型 引入参数对象 本文是这个系列的第二篇文章,介绍了通过引入参数对象应对参数过多的问题.如果你也希望参与类似的系 ...

  7. 如何理解Java中参数传递只能传值?

    以前学习C#的时候,是完全在工作岗位上学习,一些底层较为深入的道理都不是很清楚.如今学习了Java,对于Java参数传递只能传值,不能传引用(指针)感到很困惑,在C#中不是常常说把某个引用传递到函数中 ...

  8. Java05-day05【方法(概述、调用过程图解)、带参方法、带返回值方法、重载、方法参数传递(基本类型、引用类型)】

    java零基础入门到精通(2019版)[黑马程序员] 视频+资料:[链接:https://pan.baidu.com/s/1MdFNUADVSFf-lVw3SJRvtg   提取码:zjxs] &qu ...

  9. Java方法中的参数太多,第4部分:重载

    期望将过多的参数传递给Java方法的问题之一是,该方法的客户端很难确定它们是否以适当的顺序传递了适当的值. 在以前的文章中,我描述了如何使用自定义类型 , 参数对象和构建器来解决此问题. 解决此问题的 ...

最新文章

  1. hive安装报错如何解决?
  2. JavaScript正则表达式快速判断技巧
  3. Ajax Toolkit日历控件CalendarExtender求教!
  4. HelloWorld程序的编译运行
  5. SICNU 2018 Summer Training #9
  6. [html] 页面导入样式时,使用link和@import有什么区别?
  7. Canvas之进度条的制作(矩形,圆环)
  8. python工厂模式 取代__init___浅析Python 简单工厂模式和工厂方法模式的优缺点
  9. STM32之RCC原理
  10. 仿哔哩哔哩出错404错误页面源码
  11. 谷歌Auto-DeepLab:自动搜索图像语义分割架构算法开源实现
  12. 中国最让人脸红的节目:爆火14年的湿身诱惑,为何还没被叫停?
  13. idea 编译jar_Flink1.9.2源码编译和使用
  14. 采购订单模板_金蝶KIS商贸版(采购模块)常见问题汇总
  15. PCBLayout相关注意事项和常见问题
  16. Pytorch 残差网络 ResNet
  17. 1630 - FUNCTION hkwork.count does not exist. Check the 'Function Name Parsing and Resolution' sectio
  18. springboot+微信小程序校园疫情智慧防控系统毕业设计源码011133
  19. 如何删除tmp计算机桌面,win10系统下tmp临时文件删除不了如何解决
  20. Python爬虫进阶之某支付网站密码分析

热门文章

  1. 坐标系(Coordinate System)
  2. 压力测试软件 loadr,初学abench压力测试 - 玄大冰 - 51Testing软件测试网 51Testing软件测试网-软件测试人的精神家园...
  3. 代理模式——远程代理(一)
  4. 【白话科普】从“熊猫烧香”聊聊计算机病毒
  5. 平安好医生上半年营收28亿:同比降26% 净亏4.26亿
  6. cuda8.0 出错:/usr/bin/ld: 找不到 -lGL【转】
  7. Linux---查看内存型号
  8. 把 汇编代码翻译成二进制机器代码
  9. 求两个数中的最大值最小值算法
  10. 疫情之下春运人口回流“硬核”预测:往返这些超级网络节点城市有更大感染风险