Java方法之参数传递机制

Java方法中如果声明了形参,在调用方法时就必须给这些形参指定参数值,实际传进去的这个值就叫做实参

这就涉及到Java中的参数传递机制,值传递

基本数据类型

基本数据类型,值传递的体现是数值的传递。

public class TransferTempTest {
public static void main(String[] args) {
//基本数据类型参数传递
TransferTempTest test = new TransferTempTest();
int num1 = 10;
int num2 = 20;
System.out.println("进行交换前:");
System.out.println("num1 = " + num1 + ",num2 = " + num2);
test.swap(num1, num2);
System.out.println("交换之后:");
System.out.println("num1 = " + num1 + ",num2 = " + num2);
}
public void swap(int a, int b) {
int temp = a;
a = b;
b = temp;
System.out.println("交换过程中:");
System.out.println("num1 = " + a + ",num2 = " + b);
}
}
//运行结果
进行交换前:
num1 = 10,num2 = 20
交换过程中:
num1 = 20,num2 = 10
交换之后:
num1 = 10,num2 = 20

整个过程的内存图演示:

如图所示:

  1. 在堆内存中创建 TransferTempTest类型的对象,假设此时地址值时0x1177(只是假设),并让栈内存中的引用变量test存储0x1177,指向该对象。
  2. 在栈内存中声明两个变量num1和num2,并为他们赋值10和20。这时可以看到打印的结果为:num1 = 10,num2 = 20
  3. 程序继续向下,进入swap方法,首先在栈区声明两个变量a和b,他们都是形参,这时将num1和num2的分别传入,此时如蓝色字体所显示,a=10,b=20。
  4. 接着还是在栈区声明一个名为temp的变量,这时执行的交换过程是在swap方法中,交换的变量其实是num1和num2的拷贝值,所以方法内打印:num1 = 20,num2 = 10
  5. 最后,退出这个方法,局部变量销毁,发现其实一顿操作,原先的值根本就没有改变,打印结果和原先一样:num1 = 10,num2 = 20

引用数据类型

基本数据类型,值传递的体现是地址值的传递。

public class TransferTempTest {
public static void main(String[] args) {
//引用类型参数传递
DataTemp data = new DataTemp();
data.a = 2;
data.b = 4;
System.out.println("进行交换前:");
System.out.println("data.a = " + data.a + ",data.b = " + data.b);
data.swapClass(data);
System.out.println("进行交换后:");
System.out.println("data.a = " + data.a + ",data.b = " + data.b);
}
}
class DataTemp {
int a;
int b; public void swapClass(DataTemp data) {
int temp = data.a;
data.a = data.b;
data.b = temp;
System.out.println("交换过程中:");
System.out.println("data.a = " + data.a + ",data.b = " + data.b); }
}
//运行结果
进行交换前:
data.a = 2,data.b = 4
交换过程中:
data.a = 4,data.b = 2
进行交换后:
data.a = 4,data.b = 2

整个过程的内存图显示:

如图所示:

  1. 在堆内存中创建DataTemp类型的对象,并让栈内存中的引用变量data存储0x7788(假设地址值),指向该对象,实例变量a和b的初始值都是0。
  2. 让data.a=2,data.b=4,如蓝色字体显示,这时打印:data.a = 2,data.b = 4
  3. 进入swapClass方法,首先在栈区声明形参变量data,将原来的data的地址值传入,红黑两个data不是同一个!!,红色data只是黑色data的拷贝值,且拷贝的是地址值。这时两个data指向同一片堆区内存,如红色箭头显示。
  4. 接着还是在栈区声明一个名为temp的变量,参与交换操作,这时操作的是堆区的数据,所以方法里显然打印:data.a = 4,data.b = 2
  5. 最后,退出这个方法,局部变量销毁,执行的交换过程虽然是在swapClass方法中,但引用变量传入形参传递的是地址值,意味着,这时的交换操作直接对堆区对象生效,所以最终交换成立:data.a = 4,data.b = 2

综合练习

package com.my.pac05;

public class TransferTest {
public static void main(String[] args) {
TransferTest test = new TransferTest();
test.first();
} public void first() {
int i = 5;
Value v = new Value(); v.i = 25;
second(v, i);
System.out.println(v.i);
} public void second(Value v, int i) {
i = 0;
v.i = 20;
Value val = new Value();
v = val;
System.out.println(v.i + " " + i);
}
} class Value {
int i = 15;
}
//运行结果
15 0
20

整个过程的内存图显示:

总结

  • 方法不能修改基本数据类型的参数,他们改变的仅仅是他们的拷贝。
  • 方法可以改变对象参数的状态,因为方法可以通过对象引用的拷贝修改对象状态。
  • 方法不能让对象参数引用一个新的对象,方法得到的永远都是拷贝值。

Java方法之参数传递机制的更多相关文章

  1. 我的Java开发学习之旅------>Java语言中方法的参数传递机制

    实参:如果声明方法时包含来了形参声明,则调用方法时必须给这些形参指定参数值,调用方法时传给形参的参数值也被称为实参. Java的实参值是如何传入方法?这是由Java方法的参数传递机制来控制的,Java ...

  2. 深入理解Java中方法的参数传递机制

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

  3. Java高频经典面试题(第一季)四:方法的参数传递机制

    考点? 方法的参数传递机制 String,包装类等对象的不可变性 方法的参数传递机制: ①形参是基本数据类型 传递数据值 ②实参是引用数据类型 传递地址值 特殊的类型:String.包装类等对象不可变 ...

  4. JavaSE 面试题: 方法的参数传递机制

    JavaSE 面试题 方法的参数传递机制 import java.util.Arrays; public class Test { public static void main(String[] a ...

  5. java 对象的this使用 java方法中参数传递特性 方法的递归

    一.this关键字,使用的情形,以及如何使用. 1.使用的情形 类中的方法体中使用this  --初始化该对象 类的构造器中使用this --引用,调用该方法的对象 2.不写this,调用 只要方法或 ...

  6. 068 01 Android 零基础入门 01 Java基础语法 08 Java方法 06 参数传递问题——基本数据类型传值

    068 01 Android 零基础入门 01 Java基础语法 08 Java方法 06 参数传递问题--基本数据类型传值 本文知识点:参数传递问题--基本数据类型传值 说明:因为时间紧张,本人写博 ...

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

    问:当一个对象被当作参数传递到一个方法后,此方法可改变这个对象的属性,并可返回变化后的结果,那么这里到底是值传递还是引用传递?  答:是值传递.Java 编程语言只有值传递参数.当一个对象实例作为一个 ...

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

    问:当一个对象被当作参数传递到一个方法后,此方法可改变这个对象的属性,并可返回变化后的结果,那么这里到底是值传递还是引用传递?  答:是值传递.Java 编程语言只有值传递参数.当一个对象实例作为一个 ...

  9. java中方法的参数传递机制(值传递还是引用传递)

    看到一个java面试题: 问:当一个对象被当作参数传递到一个方法后,此方法可改变这个对象的属性,并可返回变化后的结果,那么这里到底是值传递还是引用传递?  答:是值传递.Java 编程语言只有值传递参 ...

随机推荐

  1. CSS | 圣杯布局、双飞翼布局 | 自适应三栏布局

    圣杯布局和双飞翼布局是前端工程师需要日常掌握的重要布局方式.两者的功能相同,都是为了实现一个两侧宽度固定,中间宽度自适应的三栏布局 虽然两者的实现方法略有差异,不过都遵循了以下要点: 1.两侧宽度固定 ...

  2. 《Dotnet9》系列-开源C# WPF项目1《Accelerider.Windows》强力推荐

    时间如流水,只能流去不流回! 点赞再看,养成习惯,这是您给我创作的动力! 本文 Dotnet9 https://dotnet9.com 已收录,站长乐于分享dotnet相关技术,比如Winform.W ...

  3. 红帽杯-MISC-Advertising for Marriage

    convert -flip screenshot.png screensho1.png 本篇结合我上一博客https://www.cnblogs.com/qq3285862072/p/11869403 ...

  4. [ASP.NET Core 3框架揭秘] 依赖注入[8]:服务实例的生命周期

    生命周期决定了IServiceProvider对象采用怎样的方式提供和释放服务实例.虽然不同版本的依赖注入框架针对服务实例的生命周期管理采用了不同的实现,但总的来说原理还是类似的.在我们提供的依赖注入 ...

  5. 远程桌面MATLAB启动失败问题解决

    博客:博客园 | CSDN | blog 远程桌面打开MATLAB会报错,解决办法,打开matlab的licenses路径,如matlab/R2017b/licenses/,路径下存有license文 ...

  6. 浅析椭圆曲线加密算法(ECC)

    本文首发于先知社区,原文链接:https://xz.aliyun.com/t/6295 数学基础 黎曼几何中的"平行线" 欧几里得<几何原本>中提出五条公设: 过相异两 ...

  7. spring boot 2 + shiro 实现权限管理

    Shiro是一个功能强大且易于使用的Java安全框架,主要功能有身份验证.授权.加密和会话管理.看了网上一些文章,下面2篇文章写得不错.Springboot2.0 集成shiro权限管理 Spring ...

  8. MPV源码探究:源码结构和调用层次

    源码结构和调用层次 源码结构 从 Github 上拉取最新的源码,目录结构大致如下: H:\MPV ├─.github ├─audio │ ├─decode │ ├─filter │ └─out ├─ ...

  9. 局域网地址为什么是192.168.X.X?为什么连上公司的VPN就上不了网?

    注:本文主要目的是给程序员讲述一些局域网/VPN的基本知识,并不涉及到具体的实操.关于如何安装VPN服务器.配置VPN客户端及修改Windows路由表等具体实操内容,请自行搜索. RFC 局域网地址为 ...

  10. 用 Keras 实现单词级的 one-hot 编码 & 使用散列技巧的单词级的 one-hot 编码

    from keras.preprocessing.text import Tokenizer samples = ['The cat sat on the mat.', 'The dog ate my ...