java值传递和引用传递

  • 2021年10月29日
  • Java

package test.entity;

/**
 * 值传递测试
 * @author 601162789@qq.com
 * 创建日期::2016年12月28日 <br/>
 */
public class Test {

	/**
	 * 先创建一个更改变量的函数,并加上了打印的函数用于比较
	 */
	public void change(int c) {
		c = c * 5;
		System.out.println(c);
	}

	public static void main(String[] args) {
		int p = 5; 		// 先声明一个变量p=5
		Test c = new Test();	// 创建对象c
		c.change(p);		// 利用c的成员函数改变p值,使p=p*5
		System.out.print(p);	// 输出的值为:25, 5
		//分析:这就是按值传递的效果,因为此时传入的不是p本身,只是p代表的值,即5*5=25
		//而后一个打印出的5,是由于p在该方法域内,并没有发生改变,因此结果是5
	}

}
package test.entity;

/**
 * 引用传递测试
 * @author 601162789@qq.com
 * 创建日期::2016年12月28日 <br/>
 */
public class Student {
	/**
	 * 学生名称
	 */
	public String name;

	/**
	 * 设计重载构造函数,为了后面的演示方便
	 */
	public Student() {
	}

	/**
	 * 用于取名的构造函数
	 * @param name 传入学生姓名
	 */
	public Student(String name) {
		this.name = name;
	}

	/**
	 * 用于修改名称的成员函数
	 * @param s 学生对象
	 */
	public void changName(Student s) {
		this.name = s.name;
	}

	public static void main(String[] args) {
		Student a = new Student("李明");	// 创建a这个人给a学生取名李明
		Student b = new Student("赵明");	// 创建b这个人给b学生取名赵明
		Student c = new Student();	        // 创建c这个人,还未起名
		System.out.println("a同学名字是" + a.name);	// 分别输出a,b两个人的名字
		System.out.println("b同学名字是" + b.name);	// 分别输出a,b两个人的名字
		
		// 将c人的名字指向b,实质是将b的地址赋给c,这样c,b同指一片内存区域
		c = b;			
		System.out.println("c同学名字是" + c.name);	// c的名字变为了赵明
		
		b.changName(a);	// 利用改名函数将a的名字赋给b
		System.out.println("b同学名字是" + b.name);	// 这时b同学名字:李明
		System.out.println("c同学名字是" + c.name);	// 这时c同学名字:李明
	    //分析:c对象的值是引用于b对象的,当b对象发生改变的时候,c对象随之发生变化
	}

}

发表回复

您的电子邮箱地址不会被公开。 必填项已用 * 标注