java參数传递方式问题

java的參数传递方式到底是值传递还是引用传递,这一直是一个争论不休的问题,一直以来没有形成统一意见。

在这里,我也仅仅是说一说个人见解,不保证是对的,全当是抛砖引玉。

首先我的观点是java採用的是值传递,即使是引用作为实參也仅仅是将引用的值传递给另外一个引用,说白了还是值传递。

1、首先对于java基本类型(如int,double,byte)和不可变类型如(String)做參数一定是值传递,如以下程序:

public class Config {
	public static void main(String[] args) {
		int a1=9;
		String s1="abc";
		System.out.println("改变之前,a1="+a1+",s1="+s1);
		Change(a1);
		Change(s1);
		System.out.println("改变之后,a1="+a1+",s1="+s1);
	}
	public static void Change(int a2) {
		a2=12;
	}
	public static void Change(String s2) {
		s2="def";
	}
}

因为參数是值传递,编译器仅仅是将a1、s1的值传递给了a2、s2,当a2、s2的值发生变化时不会影响实參a1、s1的值,所以不变。

2、对于java对象的引用做參数,依旧是值传递

仅仅是此时的值传递,是将一个引用的值传递给还有一个引用,如以下所看到的:

public class Config {
	public static void main(String[] args) {
		StringBuffer s1=new StringBuffer("abc");
		System.out.println("改变之前,s1="+s1);
		Change(s1);
		System.out.println("改变之后,s1="+s1);
	}
	public static void Change(StringBuffer s2) {
		s2.append("def");
	}
}

这时候大家可能就非常疑惑了,为什么在这里s1的值被改变了。

首先我们先明白一个概念,s1是一个引用而不是一个对象。new StringBuffer("abc")是一个对象,它被存放在内存中的堆里面。而s1是对new StringBuffer("abc")的引用,相当于C语言中的指针一样,里面存放着new StringBuffer("abc")的地址,s1被放在内存中的栈里面。s1指向new
StringBuffer("abc"),例如以下:

当s1作为实參时,是将s1的值复制给s2,s2也是一个引用,此时相当于将的s1中存放的地址复制给了s2,此时s2也指向了new StringBuffer("abc"),例如以下:

此时因为s2也存放了StringBuffer("abc")的地址,s2.append("def")相当于直接在StringBuffer("abc")后面插入了“def”,因此输出的s1结果发生了变化。

再看以下这个样例:

public class Config {
	public static void main(String[] args) {
		StringBuffer s1=new StringBuffer("abc");
		System.out.println("改变之前,s1="+s1);
		Change(s1);
		System.out.println("改变之后,s1="+s1);
	}
	public static void Change(StringBuffer s2) {
		s2=new StringBuffer("def");
	}
}

可能大家看到这个结果会更加的不解,这个时候s1为啥没有发生变化呢??

首先,引用s1的值传递给了引用s2,此时s2存放着StringBuffer("abc")的地址,然后s2=new StringBuffer("def")这一步又将StringBuffer("def")的地址赋给了s2,也就是说s2中的地址发生了变化,不再指向StringBuffer("abc"),即s1、s2指向了不同的对象,所以s2之后的操作不再影响到s1。例如以下:

以上纯属个人见解,欢迎各种喷!!

时间: 2024-07-29 10:08:28

java參数传递方式问题的相关文章

Java參数传递方式

原文:http://blog.sina.com.cn/s/blog_59ca2c2a0100qhjx.html,我作了些改动并添加了一个实例,添加对照 本文通过内存模型的方式来讨论一下Java中的參数传递. 1.基本类型參数的传递方式 这里的内存模型涉及到两种类型的内存:栈内存(stack)和堆内存(heap).基本类型作为參数传递时,传递的是这个值的拷贝. 不管你怎么改变这个拷贝,原值是不会改变的. 看下边的一段代码,然后结合内存模型来说明问题: public class ParameterT

ionic新手教程第七课-简要说明几种界面之间的參数传递及优缺点

截至2016年4月13日19点32分,我公布的ionic新手教程,已经公布6课了, 总訪问量将近6000,平均每节课能有1000的訪问量.当中訪客最多的是第三课有2700的訪客. watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQv/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/Center" > 事实上我開始的时候计划的挺好的,就依照我这阶段的安排,慢慢的带大家做一个

參数传递(引用,指针,值传递)C++11

C++中,函数的參数传递方式有值传递.地址传递.传地址有指针和引用方式. 在函数參数中,传地址的理由有: 1.使被调函数能够改动主调函数中的数据对象: 2.传地址能够降低数据拷贝,提高程序运行速度. 那么,何时使用值传递,何时使用地址传递(指针和引用)? 以下是一些写代码时会遇到的一些情况 被调函数使用參数对象时,不会改动数据对象 假设要传入函数的数据对象较小,比方是内建数据类型或小规模的结构体,那么使用值传递: 假设数据对象是数组,那么使用指针(这也是你唯一的选择).指针加入const修饰:

C语言函数參数传递原理

C语言中參数的传递方式一般存在两种方式:一种是通过栈的形式传递.还有一种是通过寄存器的方式传递的. 这次.我们仅仅是具体描写叙述一下第一种參数传递方式,第二种方式在这里不做具体介绍. 首先,我们看一下,以下一个简单的调用例程: int Add (int a, int b, int c) { return a+b+c; } void main() { int x =0 , y = 1, z = 2; int result = 0; result = Add(x, y, z); printf("Re

java之 ------ 可变參数和卫条件

可变參数:适用于參数个数不确定.类型确定的情况,java把可变參数当做数组处理. 可变參数必须位于最后一项.当可变參数个数多于一个时,必将有一个不是最后一项,所以仅仅支持有一个可变參数. 可变參数的书写形式如: int add(int x,int ...args){  方法体 } ... 位于变量类型和变量名之间.前后有无空格都能够: 调用可变參数的方法时.编译器为该可变參数隐含创建一个数组,在方法体中以数组的形式訪问可变參数. 条件逻辑推断型的应用(模拟人工推理) /* 有人邀请A,B,C,D

java 变长參数使用原则

1.java变长參数用...表示,如Print(String... args){  ... }; 2.假设一个调用既匹配一个固定參数方法.又匹配一个变长參数方法,则优先匹配固定參数的方法 3.假设一个调用能匹配两个及以上的变长參数方法,则出现错误--这事实上表示方法设计有问题,编译器会提示The method is ambiguous 4.方法仅仅能有一个变长參数,且必须放在參数列表的最后一个

java -D參数简化增加多个jar【简化设置classpath】

1.-D<name>=<value> set a system property  设置系统属性. java命令引入jar时能够-cp參数,但时-cp不能用通配符(多个jar时什么烦要一个个写,不能*.jar),面通常的jar都在同一文件夹.且多于1个. -Djava.ext.dirs 有了这个,就不用一个一个的写了. 如:java -Djava.ext.dirs=lib MainClass 这样就能够达到简化设置classpath了

【JAVA学习】“-Xmx1024m -Xms1024m -Xmn512m -Xss256k”——Java执行參数(转)

年轻代 年老代概念 http://jefferent.iteye.com/blog/1123677 JVM的堆的内存, 是通过以下面两个參数控制的 -Xms 最小堆的大小, 也就是当你的虚拟机启动后, 就会分配这么大的堆内存给你 -Xmx 是最大堆的大小 当最小堆占满后,会尝试进行GC,假设GC之后还不能得到足够的内存(GC未必会收集到全部当前可用内存),分配新的对象,那么就会扩展堆,假设-Xmx设置的太小,扩展堆就会失败,导致OutOfMemoryError错误提示. 实际上,细节不止于此, 

java课堂练习之可变參数与卫条件

/* 有人邀请A,B,C,D,E,F 6个人參加一项会议,这6个人有些奇怪.由于他们有非常多要求,已知: 1)A,B两人至少有1人參加会议: 2)A,E,F 3人中有2人參加会议. 3)B和C两人一致决定,要么两人都去,要么两人都不去: 4)A,D两人中仅仅1人參加会议. 5)C,D两人中也仅仅要1人參加会议: 6)假设D不去,那么E也决定不去. 那么最后到底有哪几个人參加了会议呢? */ 可变參数必须位于最后一项. 当可变參数个数多于一个时.必将有一个不是最后一项.所以仅仅支持有一个可变參数.