Java 方法参数传递
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
从运行结果来看,变量num
、a
、b
都没有发生改变。这是因为 基本数据类型传递过去的都是 值 的拷贝,所以方法内部无论怎么修改变量的值都不会对外部变量产生影响。
对象引用
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 方法参数传递相关推荐
- java list作为参数传递_Java 程序将lambda表达式作为方法参数传递
Java 程序将lambda表达式作为方法参数传递 在此示例中,我们将学习将lambda表达式作为Java中的方法参数传递. 要理解此示例,您应该了解以下Java编程主题: 示例1:将lambda表达 ...
- Java实验方法参数传递与递归_4.3类的结构之二:方法(return,重载,可变个数形参,值传递,递归)...
类的设计中,两个重要结构之二:方法 * 方法:描述类应该具有的功能. * 比如:Math类:sqrt()\random()\ .. * Scanner类:nextXxx() .. * Arrays类: ...
- java方法的参数传递规则_java语言参数传递介绍
java语言参数传递介绍 Java不只是一种编程语言,它是一个完整的平台,拥有庞大的库,将诸如图形绘制.Socket连接.数据库存取等复杂操作进行了最大程度的简化.下面是小编分享的java语言参数传递 ...
- 【Java】探究Java方法的参数传递是值传递还是引用传递
测试思路 每个更改形参的方法,返回值都是void,不同方法的参数设置不同类型. 注意在方法内测地址的时候在改之前测一下,才能看出传入参数是不是传了地址.(注意反正OS的内存地址是虚拟的,JVM中的也是 ...
- java 方法当参数_如何在Java中将函数作为参数传递?
如何在Java中将函数作为参数传递? 这个问题在这里已有答案: Java Pass方法作为参数 14个答案 是否可以将方法作为参 ...
- java.函数参数太多,Java方法参数太多怎么办—Part 2—引入参数对象,javapart
Java方法参数太多怎么办-Part 2-引入参数对象,javapart 目录 自定义类型 引入参数对象 本文是这个系列的第二篇文章,介绍了通过引入参数对象应对参数过多的问题.如果你也希望参与类似的系 ...
- 如何理解Java中参数传递只能传值?
以前学习C#的时候,是完全在工作岗位上学习,一些底层较为深入的道理都不是很清楚.如今学习了Java,对于Java参数传递只能传值,不能传引用(指针)感到很困惑,在C#中不是常常说把某个引用传递到函数中 ...
- Java05-day05【方法(概述、调用过程图解)、带参方法、带返回值方法、重载、方法参数传递(基本类型、引用类型)】
java零基础入门到精通(2019版)[黑马程序员] 视频+资料:[链接:https://pan.baidu.com/s/1MdFNUADVSFf-lVw3SJRvtg 提取码:zjxs] &qu ...
- Java方法中的参数太多,第4部分:重载
期望将过多的参数传递给Java方法的问题之一是,该方法的客户端很难确定它们是否以适当的顺序传递了适当的值. 在以前的文章中,我描述了如何使用自定义类型 , 参数对象和构建器来解决此问题. 解决此问题的 ...
最新文章
- hive安装报错如何解决?
- JavaScript正则表达式快速判断技巧
- Ajax Toolkit日历控件CalendarExtender求教!
- HelloWorld程序的编译运行
- SICNU 2018 Summer Training #9
- [html] 页面导入样式时,使用link和@import有什么区别?
- Canvas之进度条的制作(矩形,圆环)
- python工厂模式 取代__init___浅析Python 简单工厂模式和工厂方法模式的优缺点
- STM32之RCC原理
- 仿哔哩哔哩出错404错误页面源码
- 谷歌Auto-DeepLab:自动搜索图像语义分割架构算法开源实现
- 中国最让人脸红的节目:爆火14年的湿身诱惑,为何还没被叫停?
- idea 编译jar_Flink1.9.2源码编译和使用
- 采购订单模板_金蝶KIS商贸版(采购模块)常见问题汇总
- PCBLayout相关注意事项和常见问题
- Pytorch 残差网络 ResNet
- 1630 - FUNCTION hkwork.count does not exist. Check the 'Function Name Parsing and Resolution' sectio
- springboot+微信小程序校园疫情智慧防控系统毕业设计源码011133
- 如何删除tmp计算机桌面,win10系统下tmp临时文件删除不了如何解决
- Python爬虫进阶之某支付网站密码分析
热门文章
- 坐标系(Coordinate System)
- 压力测试软件 loadr,初学abench压力测试 - 玄大冰 - 51Testing软件测试网 51Testing软件测试网-软件测试人的精神家园...
- 代理模式——远程代理(一)
- 【白话科普】从“熊猫烧香”聊聊计算机病毒
- 平安好医生上半年营收28亿:同比降26% 净亏4.26亿
- cuda8.0 出错:/usr/bin/ld: 找不到 -lGL【转】
- Linux---查看内存型号
- 把 汇编代码翻译成二进制机器代码
- 求两个数中的最大值最小值算法
- 疫情之下春运人口回流“硬核”预测:往返这些超级网络节点城市有更大感染风险