您的位置:首页 > 职场人生

面试题:java参数传递

2012-11-30 21:07 211 查看
public class TestString {

public static void link(String a){

a+="World";

}

public static void main(String args[]){

String a="Hello";

link(a);

System.out.println(a);

}

}

输出结果:Hello

解析:String类型作为参数传递在Java中为值传递。

Java程序总是从main方法开始执行,main方法开始定义了a这个局部变量,当程序执行link()方法时,系统进入link()方法,并将main()方法中的a变量作为参数传入link()方法,传入link()方法的只是a的副本,而不是a本身,进入link()方法后系统中产生了两个变量(两个a)。系统分别为main()和link()分配两块栈区,用于保存main()和link()方法的局部变量a。程序在link()方法中将变量a改为HelloWorld,而main()方法中的变量a的值并未改变。

值传递的实质:当系统开始执行方法时,系统为形参执行初始化,,就是把实参变量的值赋给方法的形参变量,方法里操作的并不是实际的实参变量。

public class Demo01 {

public static void link(StringBuffer a){

a.append("World");

}

public static void main(String args[]){

StringBuffer a=new StringBuffer("Hello");

link(a);

System.out.println(a);

}

}

运行结果:HelloWorld

解析:StringBuffer类型作为参数传递在Java中为引用传递。

程序从main方法开始执行,main方法开始创建了一个StringBuffer对象,并定义了一个a引用变量来指向StringBuffer对象,这是一个与基本类型不同的地方。创建一个对象时,系统内存中有两个东西:堆内存中保存了对象本身,栈内存中保存了引用该对象的引用变量。接着程序通过引用来操作StringBuffer对象,接下来,main方法开始调用link()方法,main方法并未结束,系统会分别开辟出main和link两个栈区,用于存放main和link方法的局部变量。值得指出的是,main方法中的a是一个引用,它保存了StringBuffer对象的地址值,当把a的值赋给link方法的a形参后,即让link方法的a形参也保存这个地址值,即也会引用到堆内存中的StringBuffer对象。这种参数传递方式是不折不扣的值传递方式,系统一样复制了a的副本传入link()方法,但关键在于a只是一个引用变量,所以系统复制了a变量,但并未复制StringBuffer对象。当程序在link()方法中操作a形参时,由于a只是一个引用变量,故实际操作的还是堆内存中的StringBuffer对象。此时,不管是操作main()方法里的a变量,还是操作link()方法里的a参数,其实都是操作它所引用的StringBuffer对象,它们操作的是同一个对象。因此当link()方法中参数a改变了,man()方法中a变量所引用StringBuffer对象的a也改变了。

public class Demo01 {

public static void link(StringBuilder a){

a.append("World");

}

public static void main(String args[]){

StringBuilder a=new StringBuilder("Hello");

link(a);

System.out.println(a);

}

}

运行结果:HelloWorld

解析:说明StringBuilder和StringBuffer一样,作为参数传递时为引用传递
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: