java-值传递-基本类型/对象类型

值传递:

方法调用时,实际参数把它的值传递给对应的形式参数,函数接收的是原始值的一个copy,此时内存中存在两个相等的基本类型,即实际参数和形式参数,后面方法中的操作都是对形参这个值的修改,不影响实际参数的值。

引用传递:

也称为传地址。方法调用时,实际参数的引用(地址,而不是参数的值)被传递给方法中相对应的形式参数,函数接收的是原始值的内存地址;
在方法执行中,形参和实参内容相同,指向同一块内存地址,方法执行中对引用的操作将会影响到实际对象


对于“java语言中只有值传递,没有引用传递”。我觉得没错。

对于基本类型数据的传递:传递的变量的值

对象类型的传递:传递的变量的地址

数组类型的传递:传递的数组的地址


而无论传递的是值本身还是地址,传入方法的参数都是原始值的一个copy,而对这个形式参数的操作都不会影响原本值(无论是值还是地址)


public class Test1 {

	static class a{

	}
	
	public static void main(String[] args) {
		// TODO Auto-generated method stub
		int i = 1;
		System.out.println("基本类型数据传入方法前:"+i);//基本类型数据传入方法前:1
		change(i);
		System.out.println("基本类型数据传入方法后:"+i);//基本类型数据传入方法后:1
		
		a a1 = new a();
		System.out.println("对象类型数据传入方法前:"+a1);//对象类型数据传入方法前:对象等号.Test1$a@2a139a55
		changea(a1);
		System.out.println("对象类型数据传入方法后:"+a1);//对象类型数据传入方法后:对象等号.Test1$a@2a139a55
		
		int shuzu[] = new int[2];
		System.out.println("数组传入方法前:"+shuzu);//数组传入方法前:[I@6d06d69c
		changeshuzu(shuzu);
		System.out.println("数组传入方法后:"+shuzu);//数组传入方法后:[I@6d06d69c

	}

	private static void changeshuzu(int[] shuzu) {
		// TODO Auto-generated method stub
		shuzu = new int[3];
		System.out.println("数组传入方法中:"+shuzu);
	}

	private static void changea(a a1) {
		// TODO Auto-generated method stub
		a1 = new a();
		System.out.println("对象类型数据传入方法中:"+a1);//对象类型数据传入方法中:对象等号.Test1$a@15db9742
	}

	private static void change(int i) {
		// TODO Auto-generated method stub
		i = 100;
		System.out.println("基本类型数据传入方法中:"+i);//基本类型数据传入方法中:100
	}

}


下面的对象和数组,传入方法的时候都是,传入自身地址的一个copy,改变这个copy,自然不会对原来自身的地址值有变化;

但是如果改变这个copy里的值,自然会影响原来地址里面的值;毕竟这个地址只有一个嘛;

/*
 * 传入方法之前i:15
传入方法之后i:20
传入方法之前数组内容:1,2,3
传入方法之后数组内容:10,20,30*/
public class Test2 {

	static class b{
		int i = 15;
		
	}
	
	public static void main(String[] args) {
		// TODO Auto-generated method stub
		b b1 = new b();
		System.out.println("传入方法之前i:"+b1.i);
		changeb(b1);
		System.out.println("传入方法之后i:"+b1.i);
		
		int shuzu[] = {1,2,3};
		System.out.println("传入方法之前数组内容:"+shuzu[0]+","+shuzu[1]+","+shuzu[2]);
		changeshuzu(shuzu);
		System.out.println("传入方法之后数组内容:"+shuzu[0]+","+shuzu[1]+","+shuzu[2]);
	}

	private static void changeshuzu(int[] shuzu) {
		// TODO Auto-generated method stub
		shuzu[0] = 10;
		shuzu[1] = 20;
		shuzu[2] = 30;
	}

	private static void changeb(b b1) {
		// TODO Auto-generated method stub
		b1.i = 20;
	}

}


String ,Integer ,Double 虽然也是类,但是设计成不可变(immutable)类,可以当做传递值本身的值传递;

/*

public class Test3 {

	public static void main(String[] args) {
		// TODO Auto-generated method stub
		String a = "a1";
		System.out.println("传入方法前:"+a);//传入方法前:a1
		changestring(a);
		System.out.println("传入方法后:"+a);//传入方法后:a1
		
		Integer a1 = 1;
		System.out.println("传入方法前:"+a1);//传入方法前:1
		changeInteger(a1);
		System.out.println("传入方法后:"+a1);//传入方法后:1
	}

	private static void changeInteger(Integer a1) {
		// TODO Auto-generated method stub
		a1 =100;
	}

	private static void changestring(String a) {
		// TODO Auto-generated method stub
		a = "a2";
	}

}





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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

obession

觉得有用可以打赏咖啡一杯~

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

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

打赏作者

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

抵扣说明:

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

余额充值