java中只有值传递(又称浅拷贝和深拷贝)

1 目标

    探索java中到底是值传递还是引用传递.或只存在值传递.

2 证明过程

2.1 概念描述

1 值传递(pass by value)是指在调用函数时将实际参数复制一份传递到函数中,这样在函数中如果对参数进行修改,将不会影响到实际参数。
2 引用传递(pass by reference)是指在调用函数时将实际参数的地址直接传递到函数中,那么在函数中对参数所进行的修改,将影响到实际参数。

2.2 代码描述

值传递:
   public static void main(String[] args) {
       AddressValue value = new AddressValue();
       /*  System.out.println(value.nameOne());
        System.out.println(value.two());
        System.out.println(value.name);*/
       int i = 10;
        value.nameOne(i);
        System.out.println(i);

    }
     public String nameOne(int i){
        i = 20;
        System.out.println(i);
        return this.name = "hrjk";
    }

上面输出:

20
10
引用传递:
   public void  scentence(AddressValue placeValue){
         placeValue.setName("李红");
        System.out.println(placeValue.toString());
     }
    public static void main(String[] args) {
       AddressValue value = new AddressValue();
       value.setName("李明");
       value.scentence(value);
        System.out.println(value.toString());

    }
}

输出:

 AddressValue{name='李红'}
AddressValue{name='李红'}

乍一看,我们好像得知了真理,没错一定是这样,一定是这样,然后这样就彻底推翻了我以前的结论:

 public String keepchar(String s){
         s = "*****";
         System.out.println("改变前---"+s);
         return    s;

     }
    public static void main(String[] args) {
        String s = "han***";
       AddressValue value = new AddressValue();
       value.keepchar(s);
        System.out.println("改变后---"+s);

返回结果:

改变前---*****
改变后---han***

根据上面的结果,难道最后不应该都是*****吗?为什么会出现这样的情况呢,来让我们一探究竟:
案例1分析:
将i的值拷贝了一份传给了方法,最终方法内的值改变了,但是方法外的i值依旧没有改变.
案例二分析:
将value传给scentence(AddressValue palce),将对象的引用传给了此方法,但是此引用在栈中指的是堆中它所值那个对象,然后我们直接在方法中把他的这个对象的属性给改变了,那么他这个对象肯定是改变了,但是他还是原来的那个对象,其实正确操作是这样的:

  public void  scentence(AddressValue placeValue){
        placeValue = new AddressValue();
         placeValue.setName("李红");
        System.out.println(placeValue.toString());
     }
    public static void main(String[] args) {
       AddressValue value = new AddressValue();
       value.setName("李明");
       value.scentence(value);
        System.out.println(value.tojString());

案例三:
同案例一

结论

java只有值传递,基本类型传递是浅拷贝,对象的引用传递是深拷贝

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值