Java函数参数传递例子

来源:互联网 发布:淘宝店铺有几个橱窗 编辑:程序博客网 时间:2024/04/27 10:38

Java中所操作的对象其实都是操作对象的引用,object本身保存在“堆”中,而对象的“引用“保存在寄存器或“栈”中。Java语言是按值传递参数,按引用传递对象的;(应该就是如果是原始类型就拷贝值,如果是对象就拷贝引用,而不是真正对象本身。如果方法里面将其他引用赋值给他,其实改变的只是引用,不是对象本身。所以对象的值不变。如果方法里面改变他的值,那其实改变的就是对象本身。实际上这个传入函数的值是对象引用的拷贝,即传递的是引用的地址值。另外,String类是final修饰的,不可变,它会在内存中在开辟一块新空间,所以最后的例子改不了string的值。

下面有两个例子:

1. 先定义一个类型Value 

Java代码  收藏代码
  1. public static class Value {  
  2.     private String value = "value";  
  3.     public String getValue() { return value; }  
  4.     public void setValue(String value) { this.value = value; }  
  5. }  

2. 写两个函数newValue和modifyValue:newValue会将入参指向一个新的对象,modifyValue会调用入参的setValue方法修改对象的value值。 
Java代码  收藏代码
  1. public static void newValue(Value value) {  
  2.     value = new Value();  
  3.     value.setValue("new value");  
  4.     System.out.println("In newValue, HashCode = " + value.hashCode() + ", value = " + value.getValue());  
  5. }  
  6.       
  7. public static void modifyValue(Value value) {  
  8.     value.setValue("new value");  
  9.     System.out.println("In modifyValue, HashCode = " + value.hashCode() + ", value = " + value.getValue());  
  10. }  

3. 简单的测试代码 
Java代码  收藏代码
  1. public static void main(String[] args) {  
  2.     Value value1 = new Value();  
  3.     System.out.println("Before modify, HashCode = " + value1.hashCode() + ", value = " + value1.getValue());  
  4.     // 将value1指向新的Value对象  
  5.     newValue(value1);  
  6.     System.out.println("After modify, HashCode = " + value1.hashCode() + ", value = " + value1.getValue() + "\n");  
  7.     Value value2 = new Value();  
  8.     System.out.println("Before modify, HashCode = " + value2.hashCode() + ", value = " + value2.getValue());  
  9.     // 使用object的set方法,修改对象的内部值  
  10.     modifyValue(value2);  
  11.     System.out.println("After modify, HashCode = " + value2.hashCode() + ", value = " + value2.getValue());  
  12. }  

4. 执行结果日志: 
Java代码  收藏代码
  1. Before modify, HashCode = 12677476, value = value  
  2. In newValue, HashCode = 33263331, value = new value  
  3. After modify, HashCode = 12677476, value = value  
  4.   
  5. Before modify, HashCode = 6413875, value = value  
  6. In modifyValue, HashCode = 6413875, value = new value  
  7. After modify, HashCode = 6413875, value = new value 


示例2:



 示例3:

复制代码
public class Test3 {    public static void change(int []a){        a[0]=50;    }    public static void main(String[] args) {        int []a={10,20};        System.out.println(a[0]);        change(a);        System.out.println(a[0]);    }}
复制代码

显然输出结果为10   50。实际传递的是引用的地址值。

内存分析:

            


 示例4:

复制代码
class Emp {    public int age;}public class Test {    public static void change(Emp emp)    {        emp.age = 50;        emp = new Emp();//再创建一个对象        emp.age=100;    }        public static void main(String[] args) {        Emp emp = new Emp();        emp.age = 100;        System.out.println(emp.age);        change(emp);        System.out.println(emp.age);        System.out.println(emp.age);    }}
复制代码

输出为:100  50  50.

内存分析:

                

对于String类:

复制代码
public class Test {    public static void change(String s){        s="zhangsan";    }        public static void main(String[] args) {        String s=new String("lisi");        System.out.println(s);        change(s);        System.out.println(s);    }}
复制代码

输出为:lisi   lisi,由于String类是final修饰的,不可变,它会在内存中在开辟一块新空间。



0 0