形参和实参

我们知道,在Java中定义方法时,是可以定义参数的,比如:

public static void main(String[] args){ }

这里的args就是一个字符串数组类型的参数。

在程序设计语言中,参数有形式参数和实际参数之分,先来看下它们的定义:

形式参数:是在定义函数名和函数体的时候使用的参数,目的是用来接收调用该函数时传入的参数,简称“形参”。

实际参数:在主调函数中调用一个函数时,函数名后面括号中的参数称为“实际参数”,简称“实参”。

举个栗子:

public class ParamTest { public static void main(String[] args) { ParamTest pt = new ParamTest(); // 实际参数为“张三” pt.sout("张三"); }​ public void sout(String name) { // 形式参数为 name System.out.print(name); } }

上面例子中,ParamTest类中定义了一个sout方法,该方法有个String类型的参数name,该参数即为形参。在main方法中,调用了sout方法,传入了一个参数“张三”,该参数即为实参。

那么,实参值是如何传入方法的呢?这是由方法的参数传递机制来控制的。

值传递和引用传递

参数传递机制有两种:值传递和引用传递。我们先来看下程序语言中是如何定义和区分值传递和引用传递的:

值传递:是指在调用函数时将实际参数复制一份传递到函数中,这样在函数中如果对参数进行修改,将不会影响到实际参数。

引用传递:是指在调用函数时将实际参数的地址传递到函数中,那么在函数中对参数所进行的修改,将影响到实际参数。

那么,在我们大Java中,到底是值传递还是引用传递呢?

Java中是值传递还是引用传递?

有了上面的概念,我们就可以一起来探究一下,Java中方法参数到底是值传递还是引用传递了。

先看如下代码:

public class ParamPass1 { public static void main(String[] args) { ParamPass1 p = new ParamPass1(); int i = 10; System.out.println("pass方法调用前,i的值为=" + i); p.pass(i); System.out.println("pass方法调用后,i的值为=" + i); }​ public void pass(int i) { i *= 3; System.out.println("pass方法中,i的值为=" + i); }}

上面代码中,我们在类中定义了一个pass方法,方法内部将传入的参数i的值增加至3倍,然后分别在pass方法和main方法中打印参数的值,输出结果如下:

pass方法执行前,i的值为=10pass方法中,i的值为=30pass方法执行后,i的值为=10

从上面运行结果来看,pass方法中,i的值是30,pass方法执行结束后,变量i的值依然是10。

可以看出,main方法里的变量i,并不是pass方法里的i,pass方法内部对i的值的修改并没有改变实际参数i的值,改变的只是pass方法中i的值(pass方法中,i=30),因为pass方法中的i只是main方法中变量i的复制品。

因此同学们很容易得出结论:Java中,一个方法不可能修改一个基本数据类型的参数 ,所以是值传递。

然而,结论下的还太早,因为方法参数共有两种类型:

  1. 基本数据类型
  2. 引用数据类型

前面看到的只是基本数据类型的参数,那对于引用类型的参数,又是怎么样的呢?看如下代码:

public class ParamPass2 { public static void main(String[] args) { ParamPass2 p = new ParamPass2();​ User user = new User(); user.setName("张三"); user.setAge(18);​ System.out.println("pass方法调用前,user=" + user.toString()); p.pass(user); System.out.println("pass方法调用后,user=" + user.toString()); }​ public void pass(User user) { user.setName("李四"); System.out.println("pass方法中,user = " + user.toString()); }}​class User { /** * 姓名 */ private String name;  /** * 年龄 */ private int age;​ public String getName() { return name; }​ public void setName(String name) { this.name = name; }​ public int getAge() { return age; }​ public void setAge(int age) { this.age = age; }​ @Override public String toString() { return "User{" + "name='" + name + ''' + 

两种参数类型_深入理解Java中方法的参数传递机制相关推荐

  1. java中gettext方法_深入理解Java中方法的参数传递机制

    形参和实参 我们知道,在Java中定义方法时,是可以定义参数的,比如: public static void main(String[] args){ } 这里的args就是一个字符串数组类型的参数. ...

  2. 两种参数类型_布尔参数这些缺点不能忍?不如试试枚举吧

    全文共2222字,预计学习时长9分钟 图源:unsplash 在代码库中使用布尔标志值来管理状态机似乎听起来是个不错的办法,但事实并非如此.布尔值恐怕是很多程序员接触到的第一种数据类型,它非常简单,只 ...

  3. java 中方法里的参数_【Java基础】12、java中方法的参数传递机制

    无论是什么语言,要讨论参数传递方式,就得从内存模型说起,主要是我个人觉得从内存模型来说参数传递更为直观一些.闲言少叙,下面我们就通过内存模型的方式来讨论一下Java中的参数传递. 这里的内存模型涉及到 ...

  4. java中方法的参数传递机制

    转载自 :https://www.cnblogs.com/lixiaolun/p/4311863.html 问:当一个对象被当作参数传递到一个方法后,此方法可改变这个对象的属性,并可返回变化后的结果, ...

  5. java中io是什么_深入理解Java中的IO

    深入理解Java中的IO 转载自:http://blog.csdn.net/qq_25184739/article/details/51205186 本文的目录视图如下: Java IO概要 a.Ja ...

  6. java中demo接人_return的用法_如何理解java中return的用法?

    C语言中return用法?(请熟练者进) return是返回值,这个返回值是和函数的类型有关的,函数的类型是什么,他的返回值就是什么 比方主函数intmain() {}这里就必须有一个return,只 ...

  7. java虚引用作用_深入理解Java中的引用(二)——强软弱虚引用

    深入理解Java中的引用(二)--强软弱虚引用 在上一篇文章中介绍了Java的Reference类,本篇文章介绍他的四个子类:强引用.软引用.弱引用.虚引用. 强引用(StrongReference) ...

  8. 如何理解Java自动装箱_如何理解Java中的自动拆箱和自动装箱?

    如何理解Java中的自动拆箱和自动装箱? 自动拆箱?自动装箱?什么鬼,听都没听过啊,这...这..知识盲区... 回到家后小伟赶紧查资料,我透,这不就是问基本类型跟封装类型吗,面试官整啥名词呢... ...

  9. java中方法的参数传递

    java中方法的参数传递方式只有一种:值传递: 对于基本类型来说,传递的是实参的副本(值传递),故在方法内修改传递进来的值并不会影响实参本身: 对于引用类型来说,传递进来的是引用变量的副本(也是值传递 ...

最新文章

  1. 探索 Swift 中的 MVC-N 模式
  2. 输入http://localhost/,apache出现You don't have permission to access/on this server.的提示,如何解决?...
  3. 通过启动项设置实现应用程序自启动功能
  4. OpenBSD配置Apache反向代理
  5. vs2019中如何创建qt项目_VS2019创建新项目居然没有.NET Core3.0的模板?
  6. 观察者模式Java实现
  7. html排序图标,css实现排序升降图标
  8. RabbitMQ实例教程:主题交换机
  9. 物联网专用卡的优势有哪些
  10. Mac 用快捷键选取文字,省时省力提高工作效率
  11. Python画图显示中文
  12. 3d文件格式转换工具
  13. Docker 搭建 YApi 可视化接口管理平台
  14. 找出连续数字中缺失的数字
  15. pythongui编程星期的中英文对照_编写一个程序,根据用户输入的一个英文字符翻译成相应的中文日期,如输入“M”返回“星期一”。...
  16. 从零构建知识图谱(技术、方法与案例)-第一章:知识图谱概览
  17. java实现二维码的生成和解析包含工具类
  18. https证书错误或者过期
  19. 怎样将动图静图拼在一起?教你在线拼接图片
  20. Python自动化控制鼠标和键盘操作—— PyAutoGUI

热门文章

  1. 如何研究Maven build时发生了哪些事情
  2. jMeter 线程启动时间
  3. JavaScript变量不同作用域的测试
  4. SAP Fiori Launchpad tile点击之后,后台的调整url解析机制
  5. 为什么S/4HANA的生产订单创建后会自动release
  6. SAP Cloud for Customer的微信集成原型开发完毕后的效果示意图
  7. 你的项目刚刚启动?是时候考虑Globalization了!
  8. 利用ABAP调试模式修改SE16里数据库表的内容
  9. Java程序在命令行的编译运行
  10. micropython stm32f103_MicroPython技术及应用定义