面试题: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一样,作为参数传递时为引用传递
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一样,作为参数传递时为引用传递
相关文章推荐
- java方法参数传递面试题
- java参数传递一道简单面试题
- java面试题解惑:当一个对象被当作参数传递到一个方法后,此方法可改变这个对象的属性,并可返回变化后的结果,那么这里到底是值传递还是引用传递?
- java面试题:当一个对象被当作参数传递到一个方法后,此方法可改变这个对象的属性,并可返回变化后的结果,那么这里到底是值传递还是引用传递?
- Java中的参数传递机制
- 关于Java中的参数传递问题
- 关于Java中String类型的参数传递问题
- 终极解释: java方法传递参数的方式
- java参数传递问题
- java中参数传递 4000 理解分析
- Eclipse运行java程序为主方法传递参数
- 也谈java的参数传递
- java的参数传递方式
- Java参数传递小结
- android之JNI参数传递 (Java方法调用)
- java 对象作为方法的参数传递
- Java中函数参数的传递是值传递还是引用传递
- 在Java中方法参数的传递,对象是传递引用
- java函数的参数传递和String类型
- Java函数参数传递方式详解