java的值传递机制

1.形参与实参

[1].形参:方法声明时,方法小括号内的参数

[2].实参:调用方法时,实际传入的参数的值

2.规则:java中的参数传递机制:值传递机制

[1].形参是基本数据类型的:将实参的传递给形参的基本数据类型的变量

[2].形参是引用数据类型的:将实参的引用类型变量的值(对应的堆空间的对象实体的首地址值)传递给形参的引用类型变量。首

先看一下不调用方法的情况,变量的值是怎么变化的

package com.w4xj.newStart.unit;

public class TestArgsTransfer {
	public static void main(String[] args) {
		TestArgsTransfer tt = new TestArgsTransfer();
		int i = 10;
		int j = 5;
		System.out.println("i:" + i + " j:" + j);
		 //交换变量i与j的值
		 int temp = i;
		 i = j;
		 j = temp;
		System.out.println("i:" + i + " j:" + j);

	}
}

运行结果:

i:10 j:5

i:5 j:10

变量都在栈空间里面通过temp变量完成交换,这样写没啥毛病,不过我们自然会想到写一个方法来做数据交换,接下来在TestArgsTransfer类中加入一个方法来进行数据交换

package com.w4xj.newStart.unit;

public class TestArgsTransfer {
	public static void main(String[] args) {

		TestArgsTransfer tt = new TestArgsTransfer();
		int i = 10;
		int j = 5;
		System.out.println("i:" + i + " j:" + j);
		tt.swap(i, j);// 将i的值传递给m,j的值传递给n
		System.out.println("i:" + i + " j:" + j);

	}
	
	// 定义一个方法,交换两个变量的值
	public void swap(int m, int n) {
		int temp = m;
		m = n;
		n = temp;
		System.out.println("m:" + m + " n:" + n);
	}
}

运行结果:

i:10 j:5

m:5 n:10

i:10 j:5

由于传入的实参是基本数据类型,所以传递的实际是实际的值,所以在swap中操作的形参实际是在栈空间中单独的一份,随着swap方法执行完成,空间就被收回,而main方法中的i和j并没有变化

接下来我们把i和j抽象成一个类的成员变量,改变实例的属性,会怎么样呢

public class TestArgsTransfer1 {
    public static void main(String[] args) {
        TestArgsTransfer1 tt = new TestArgsTransfer1();
        DataSwap ds = new DataSwap();

        System.out.println("ds.i:" + ds.i + " ds.j:" + ds.j);

        tt.swap(ds);
        System.out.println(ds);

        System.out.println("ds.i:" + ds.i + " ds.j:" + ds.j);

    }
    //交换元素的值
    public void swap(DataSwap d){
        int temp = d.i;
        d.i = d.j;
        d.j = temp;
        System.out.println(d);//打印引用变量d的值
    }
}
/**
  * 当然类这样声明是不规范的,这里只是为了更直观些
  */
class DataSwap{
    int i = 10;
    int j = 5;
}

运行结果:

ds.i:10 ds.j:5

com.w4xj.newStart.unit.DataSwap@6d06d69c

com.w4xj.newStart.unit.DataSwap@6d06d69c

ds.i:5 ds.j:10
 

中间变量temp在swap方法结束后销毁,而swap方法中的参数是对象,也就是引用类型,所以调用swap方法后,在main方法中调用ds对象的属性也是改变后的

[3].特别的:String类型虽然是引用类型,但是String类没有改变值的方法,所以对String重新赋值,对象的地址是变了的,原本的值其实并没有改变,关于我对String类的详细理解,我将会详细的另写一篇博客

@Test

    public void testStringHashCode(){

         String str1 = new String("str1");

         System.out.println(str1.hashCode());

         changeStr(str1);

         System.out.println(str1);

         System.out.println(str1.hashCode());

    }

    private void changeStr(String str1) {

         str1 = "str2";

         System.out.println(">>>"+str1.hashCode());

    }

/*



运行结果:

3541024

>>>3541025

str1

3541024       

*/

 

  • 2
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值