Java中方法的参数传递方式是什么?

  相信不少人会认为Java和C是一样的:当参数是基本数据类型时采用值传递而参数是非基本数据类型是采用引用传递即地址传递。真的是这样吗?

先看段代码:

public class Snippet {
	public static void main(String[] args) {
		MyObj obj = new MyObj();
		System.out.println(obj.age);
		process(obj);
		System.out.println(obj.age);
	}
	
	private static void process(MyObj obj){
		obj.age = 20;
	}
	
	static class MyObj{
		private int age = 10;
	}
	
}

  上面的代码结果大家肯定都明白:10  20。相信认为Java中有引用传递的人应该是被这样的代码蛊惑了,如果上述参数传递方式是引用传递那么下面这段代码应该打印出来什么结果呢?

public class Snippet {
	public static void main(String[] args) {
		MyObj obj = new MyObj();
		System.out.println(obj.age);
		process1(obj);
		System.out.println(obj.age);
	}
	
	private static void process(MyObj obj){
		obj.age = 20;
	}
	
	private static void process1(MyObj obj){
		obj = new MyObj();
		obj.age = 30;
	}
	
	static class MyObj{
		private int age = 10;
	}
	
}

  如果这里采用的是引用传递,那么调用process1方法会将传入的引用重新指向一个新的对象,并将该对象的age设置成30,程序运行结果应该是10  30,然而程序运行结果却是10  10!为什么呢?答案就是Java中参数传递只有一种形式——值传递!

   值传递是怎么工作的呢?第一段代码调用示意图:

process方法传递的是obj的引用的copy,就是obj引用的值,这是两个引用都指向obj对象,process方法将“obj的引用的copy”指向的对象的age属性改成了20也就把obj的引用指向的对象的age修改了。所以第一段代码调用后打印结果是10  20。

  第二段代码调用示意图:

 

 

process1方法将“obj的引用的copy”传递过来以后把“obj的引用的copy”重新指向了另一个对象,并将新对象的age改成了30,方法调用完成以后新对象弃用了当然就对后面用于打印数据的obj的引用没有任何影响了,所以结果是10  10。

 

posted on 2016-02-23 18:22  Scort  阅读(1754)  评论(0编辑  收藏  举报