值传递(值交换)

一.基本数据类型的值交换

1.需求:定义一个函数交换两个基本类型变量的值;

2.实例:

import java.util.*;
class Demo1{
	public static void main(String[] args){
		int a = 3;
		int b = 5;
		System.out.println("交换之前的值:a = "+a+"  b = "+b);
		changeValue(a,b);
		System.out.println("交换之后的值:a = "+a+"  b = "+b);
	}
	public static void changeValue(int a,int b){
		int temp = a;
		a = b;
		b = temp;
		System.out.println("方法内部交换的值:a="+a+"  b="+b);
	}
}

3.结果:发现交换值前后没有变量的值发生变化。


4.原因分析


(1)首先有个堆内存和栈内存;

(2)main方法先运行,这时候JVM就会为main方法开辟一片属于main方法的内存空间,在这片main空间里声明一个变量a和一个变量b,然后调用changevalue方法,调用这个方法后把a和b传过去,这时候JVM会为changeValue开辟一片内存空间,这片空间是属于changeValue的;

(3)changeValue中有两个形参,这两个形参是属于局部变量,也就是说在这片空间里也有一个a和b,a和b作为形参,别人在调用这个方法的时候,是把这两个变量传给这两个形参,传递过来的是main方法中a和b所存储的值,也就是说传递给changeValue这片内存空间的a和b,传递过来的值是3和5,然后在changeValue这片内存空间中方法内部做了交换,此时在方法内部确实a变成了5,b变成了3;

(4)但是这个方法内部的a和b与main方法内部的a和b没有任何关系,因为形参之间是相互独立的,只是在changeValue这片内存空间中的a和b交换成功了,当changeValue方法结束之后,changeValue方法中的a和b变量也会同时消失,而main方法中的a和b并没有交换,因为它们之间没有相互关系。

二.数组中的值交换

1.需求:定义一个函数交换数组中两个元素的位置;

2.实例:

import java.util.*;
class Demo2{
	public static void main(String[] args){
		int[] arr = {23,10,9};
		System.out.println("交换前数组的元素是:"+Arrays.toString(arr));
		changeArr(arr,1,2);
		System.out.println("交换后数组的元素是:"+Arrays.toString(arr));
	}
	public static void changeArr(int[] arr,int index1,int index2){
		int temp = arr[index1];
		arr[index1] = arr[index2];
		arr[index2] = temp;
	}
}

3.结果:交换值成功;


4.原因分析:


(1)首先仍然是一片栈内存,一片堆内存;
(2)main方法先运行,JVM会先开辟一块空间是属于main方法的,先声明一个变量,然后在堆内存中创建一个数组对象,长度为3,存储的值分别是23,10,9,假设它的内存地址是0X98,此时arr记录的就是0X98,arr指向这个对象

(3)然后在main方法中调用了changeArr(arr,1,2),把arr和1和2传递过去,这时JVM也会为changeArr开辟一片属于它的内存空间,而在changeArr中有三个形参分别接收了arr(地址),此时changeArr中的arr也是指向0X98,里面的arr也是指向了刚才的一个对象,现在两片内存空间的arr不是同一个变量,只是指向了同一个对象,所以在这个方法的内部做了一些交换值;
(4)因为changeArr方法内部是对arr进行操作,因为这片空间中的arr也指向了这个对象,所以对这个对象进行了操作,把对象中的两个位置的值做了交换,交换完成以后changeArr这片内存空间也消失了。紧接着在主方法中输出arr的这个元素,arr指向了那个对象,但是这个对象的数据已经被刚才的那个局部变量给改变了。所以出现的就是9和10,而不是10和9。

三.对象的值交换

1.实例

import java.util.*;
class Person{
	int x = 10;
}

class Demo3{
	public static void main(String[] args){
		Person p = new Person();
		changeObj(p,20);
		System.out.println("x = "+p.x);
	}
	public static void changeObj(Person p,int x){
		p.x = x;
	}
}

2.运行结果


3.内存分析:






  • 1
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
Java中的参数传递可以分为引用传递值传递两种方式。对于原始类型数据(如整型、浮点型、字符型、布尔型),传递的是它们的,称为值传递。而对于对象类型(如数组、类、接口),传递的是它们的引用,称为引用传递。 在值传递中,方法的参数是按值传递的,即方法内对参数的改变不会影响到原始。例如,下面的示例中,swap方法交换了参数a和b的,但在main方法中打印出的num1和num2的并未改变: ```java public static void main(String[] args) { int num1 = 10; int num2 = 20; swap(num1, num2); System.out.println("num1 = " + num1); System.out.println("num2 = " + num2); } public static void swap(int a, int b) { int temp = a; a = b; b = temp; System.out.println("a = " + a); System.out.println("b = " + b); } ``` 输出结果为: ``` a = 20 b = 10 num1 = 10 num2 = 20 ``` 在引用传递中,方法的参数是按引用传递的,即方法内对参数的改变会影响到原始。例如,下面的示例中,updateBaseValue方法改变了baseValue的: ```java private static int baseValue = 30; public static void updateBaseValue(int value) { value = 2 * value; } public static void main(String[] args) { System.out.println("调用前baseValue的:" + baseValue); updateBaseValue(baseValue); System.out.println("调用后baseValue的:" + baseValue); } ``` 输出结果为: ``` 调用前baseValue的:30 调用后baseValue的:30 ``` 可以看到,调用updateBaseValue方法并不会改变baseValue的,因为在方法内部,形参value是对实参baseValue的拷贝,并不影响原始

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

处女座的码农

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值