现在的位置: 首页 > 综合 > 正文

面试题:java参数传递

2013年09月21日 ⁄ 综合 ⁄ 共 1684字 ⁄ 字号 评论关闭

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一样,作为参数传递时为引用传递

抱歉!评论已关闭.