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。

时间: 2024-10-13 07:18:15

Java的参数传递问题的相关文章

如何理解Java中参数传递只能传值?

以前学习C#的时候,是完全在工作岗位上学习,一些底层较为深入的道理都不是很清楚.如今学习了Java,对于Java参数传递只能传值,不能传引用(指针)感到很困惑,在C#中不是常常说把某个引用传递到函数中吗?甚至C#有相当简便的ref.out参数,明明白白的传引用. 经过一番探索,得出的结论表明,Java中我不管你到底是传值还是传引用,只需要记住原生数据类型(值类型)和String作为参数传递的时候,其原本的值都不会发生改变:而引用类型在作为参数传递时,函数中对其的操作,都会反馈到引用所指向的值.

Jni中C++和Java的参数传递

Jni中C++和Java的参数传递 如何使用JNI的一些基本方法和过程在网上多如牛毛,如果你对Jni不甚了解,不知道Jni是做什么的,如何建立一个基本的jni程序,或许可以参考下面下面这些文章:利用VC++6.0实现JNI的最简单的例子 JNI入门教程之HelloWorld篇SUN JNI Tutorial谢谢大家的回复,有人说类型不对,己修正.类型请参照: http://docs.oracle.com/javase/7/docs/technotes/guides/jni/spec/types.

Java的参数传递是「按值传递」还是「按引用传递」?

Java 编程语言中最大的困惑之一就是: java 是按值传递还是按引用传递.我在面试中经常会问面试者这个问题,但还是有很多面试者对这个问题的理解不是很正确. 有很多面试者是这样理解的: 如果传递类型为基础数据类型,则按值传递, 如果传递类型为类,则按引用传递. 这样的理解正确吗?他们甚至还可以写出示例代码来验证他们的想法,让我们来一起看一看大多数人是如何验证"基础类型按值传递,非基础类型按引用传递"这个想法的: 基础类型数据作为参数传递 /** * 基础类型数据作为参数传递 * @A

java中参数传递

总之一句话:java中只有副本传递,对于值,拷贝值,对于引用,拷贝引用(对于数组,数组名传递的都是引用). /** * java中只有副本传递,对于值,拷贝值,对于引用,拷贝引用(对于数组,数组名传递的都是引用). * @author sargeles */ public class About_Onlyvaluetransmit { /** * 测试一组:基本类型传递是按值传递,意味着当将一个参数传递给一个函数时,函数接收的是原始值的一个副本. * String因为两个原因表现出基本类型的特征

java中参数传递--值传递,引用传递

java中的参数传递--值传递.引用传递 参数是按值而不是按引用传递的说明 Java 应用程序有且仅有的一种参数传递机制,即按值传递. 在 Java 应用程序中永远不会传递对象,而只传递对象引用.因此是按引用传递对象.Java 应用程序按引用传递对象这一事实并不意味着 Java 应用程序按引用传递参数.参数可以是对象引用,而 Java 应用程序是按值传递对象引用的. Java 应用程序中的变量可以为以下两种类型之一:引用类型或基本类型.当作为参数传递给一个方法时,处理这两种类型的方式是相同的.两

JAVA中参数传递时值传递的机制分析

参数传递是什么? 在C的函数或是JAVA的方法中,向一个函数或方法内部传递一个参数,比如: void fun( int num ){ num+=2 ; } int a = 3 ; fun( a ) ; 这个a就被作为参数传入函数fun()中,作为a,然后返回或者不返回值 回到最初,函数的作用是复用,那么我们希望这个参数传递是什么样的呢?就是假如我们去掉函数的外衣,就让函数变成代码放到之前是函数的地方,那么很自然这里最后b的值会被改变,这可以说是最朴实的参数传递了,自然的样子. 但是人们又发明了另

Java方法参数传递

方法体的概念.先有类,然后由类来生成对象,对象又叫做实例 类由两大部分构成:属性及方法.属性一般用名词来表示,方法一般用动词来表示 如果一个Java原文家定义多个类,那么这些类中只能有一个public的换句话说定义的多个类可以都不是public的 在Java中进行方法的参数传递时,无论是传递是原生数据类型还是引用数据类型,参数传递方式统一是传值,Java中没有传递引用的概念

Java方法参数传递(swap函数)(转载)

Java里方法的参数传递方式只有一种:值传递.值传递,就是将实际参数值的副本(复制品)传入方法内,而参数本身不会受到任何影响. public class PrimitiveTransferTest { public static void swap(int a,int b) { int temp=a; a=b; b=temp; System.out.println("swap方法里,a的值是"+a+";b的值是"+b); } public static void m

java的参数传递与参数返回

一.java 参数传递分为:基本类型传递和引用类型传递. 基本类型传递:传递的是真实的值 引用类型传递:传递的是引用对象的地址(数组.对象) 例子: 1.基本类型: public void  setNumber(int num){ } 2.引用类型: public void   setStudent(Student s){ } 二.java参数返回:基本类型和引用类型 返回基本类型:返回实际的值给调用者 返回引用类型:把这个对象或者数组的地址返回给调用者 1.返回基本类型: public int