Java函数参数传递例子

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修饰的,不可变,它会在内存中在开辟一块新空间。



评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值