引用传递

1.数组
数组属于引用数据类型,所以在把数组传递进方法之后,如果方法对数组本身做了任何修改,修改结果都是会保存下来的。

public class ArrayRefDemo01 {
	public static void main(String[] args) {
		int temp[] = { 1, 3, 5 };			// 使用静态初始化定义数组
		fun(temp);				// 传递数组引用 
		for (int i = 0; i < temp.length; i++) {	// 循环输出
			System.out.print(temp[i] + "、");
		}
	}
	public static void fun(int x[]) {		// 接收整型数组引用
		x[0] = 6;				// 修改第一个元素的内容
	}
}


2.对象引用传递

Person per1 = new Person();	// 实例化per1对象
Person per2 = new Person();	// 实例化per2对象

显而易见,两者单独开辟堆内存

                Person per1 = new Person();	// 只实例化per1一个对象
		Person per2 = per1 ;		// 把per1的堆内存空间使用权给per2
		per1.name = "张三";	// 设置per1对象的name属性内容
		per1.age = 30;		// 设置per1对象的age属性内容
		// 设置per2对象的内容,实际上就是设置per1对象的内容
		per2.age = 33;
		System.out.print("per1对象中的内容 --> ") ;
		per1.tell();		// 调用类中的方法
		System.out.print("per2对象中的内容 --> ") ;
		per2.tell();

这种情况,两个输出就会是一样的,因为指向为同一块堆内存
3.下面来看三种引用传递

class Demo {
	int temp = 30; 		// 此处为了访问方便,属性暂不封装
}
public class RefDemo01{
	public static void main(String[] args) {
		Demo d1 = new Demo();
		d1.temp = 50;
		System.out.println("fun()方法调用之前:" + d1.temp);
		fun(d1);
		System.out.println("fun()方法调用之后:" + d1.temp);
	}
	public static void fun(Demo d2) {		// 此处的方法由主方法直接调用
		d2.temp = 1000;
	}
}

第一种很好理解,方法调用没有开辟新的堆内存,输出为d1d2指向同一堆内存,修改直接修改内存里的值

public class RefDemo02 {
	public static void main(String[] args) {
		String str1 =new String("hello") ; // 实例化字符串对象
		System.out.println("fun()方法调用之前:" + str1);
		fun(str1);					// 调用fun()方法
		System.out.println("fun()方法调用之后:" + str1);
	}
	public static void fun(String str2) {	// 此处的方法由主方法直接调用
		str2 = new String( "MLDN") ;		// 修改字符串内容
	}
}

第二种与前一种不同之处在str2开辟了一块新内存并由hello指向MLDN,str1还为原来的hello,内存并未被修改

class Demo {
	String temp =new String("hello"); // 此处为了访问方便,属性暂不封装
}
public class RefDemo03 {
	public static void main(String[] args) {
		Demo d1 = new Demo();		// 实例化对象
		d1.temp = new String( "world");		// 修改对象中的temp属性
		System.out.println("fun()方法调用之前:" + d1.temp);
		fun(d1);				// 调用fun()方法
		System.out.println("fun()方法调用之后:" + d1.temp);
	}
	public static void fun(Demo d2) {	// 此处的方法由主方法直接调用
		d2.temp =new String( "MLDN");			// 修改属性的内容
	}
}

第三种方法将前两种结合,fun方法实际是将temp的属性修改,并未开辟新的堆空间

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值