Java的参数传递问题

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Java的参数传递问题相关的知识,希望对你有一定的参考价值。

  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。

 

以上是关于Java的参数传递问题的主要内容,如果未能解决你的问题,请参考以下文章

将接口从片段传递到kotlin中的活动

如何绕过将数据模型传递给片段参数以避免事务太大异常?

一道经典面试题:字符串在Java中如何通过“引用”传递

操作栏选项卡:使用多次实例化的单个片段时如何传递参数

如何使用java将数据从片段传递到android中的另一个片段?

Failed to convert property value of type ‘java.lang.String‘ to required type ‘int‘ for property(代码片段