java参数传递

来源:互联网 发布:淘宝刷流量 猎流 编辑:程序博客网 时间:2024/04/30 06:31

网上有个很经典的java32问,其中有一题问java参数传递方式是按值还是按引用,一般答案都说是按值。对此我有一些疑惑,查了相关资料,终于基本弄清楚了。下面是一个测试:

Java代码  收藏代码
  1. public class People  
  2. {  
  3.     private int age;  
  4.     private String name;  
  5.   
  6.     public People(String name, int age)  
  7.     {  
  8.         this.age = age;  
  9.         this.name = name;  
  10.     }  
  11.   
  12.     public void show()  
  13.     {  
  14.         System.out.println(getName()+":"+getAge());  
  15.           
  16.     }  
  17.   
  18.     public int getAge()  
  19.     {  
  20.         return age;  
  21.     }  
  22.   
  23.     public String getName()  
  24.     {  
  25.         return name;  
  26.     }  
  27.   
  28.     public void setAge(int age)  
  29.     {  
  30.         this.age = age;  
  31.     }  
  32.   
  33.   
  34.     public void setName(String name)  
  35.     {  
  36.         this.name = name;  
  37.     }  
  38.   
  39. }  
 
Java代码  收藏代码
  1. public class Main  
  2. {  
  3.     public static void main(String[] args)  
  4.     {  
  5.         int i =9;  
  6.         String s = "ppp";  
  7.         People aaa = new People("aaa",40);  
  8.           
  9.         modifyInt(i);  
  10.         modifyString(s);  
  11.         modifyObject(aaa);  
  12.           
  13.         System.out.println(i);  
  14.         System.out.println(s);  
  15.         aaa.show();  
  16.   
  17.     }  
  18.     private static void modifyInt(int i)  
  19.     {  
  20.         i = 40;  
  21.     }  
  22.     private static void modifyString(String str)  
  23.     {  
  24.         str = "sss";  
  25.     }  
  26.     private static void modifyObject(People aaa)  
  27.     {  
  28.         aaa.setAge(11);  
  29.         aaa.setName("ooo");   
  30.     }  
  31. }  

 输出结果:

Java代码  收藏代码
  1. 9  
  2. ppp  
  3. ooo:11  

 由此可见,基本类型和String类型并没有发生变化,它们是按值传递的;而一般对象发生了变化,可以说是按引用传递的。但为什么有人说对象也是按值传递的呢?理解的角度不同,他们所理解的值并不是指整个对象的具体内容,而是对象的引用(引用是什么东西呢?说白了,就是对象存储的地址,这个地址以值拷贝的方式传到了形参中,“值传递”指的就是这个)。其实对象是分两部分存储的,一个是对象引用,也就是对象在内存中的地址,存储在栈里(基本类型也是存储在栈里,栈里的东西都是值拷贝),另外一个是对象的内容,存储在堆里。

另外,我们发现String类型很奇怪,它具有基本类型的很多特点,原因之一就是它是final修饰的,既然不可变,那么执行str = "sss"时必然要new新的String,str里存放的是新的String的地址。


原文:http://nmj1987.iteye.com/blog/349463