面向对象的容易出错的赋值

package cn.it.test2;

public class Obparm {
    public static void main(String[] args) {
        Obparm o = new Obparm();
        o.amethod();
    }

    public void amethod(){
        int i =99;
        Valhold v = new Valhold();
        v.i=30;
        another( v, i);
        System.out.println("amethod---->" + v.i);
    }
    public void another(Valhold v, int i){
         i =0;
        
        v.i=20;//这个赋值会改变amethod方法里的v.i的值,因为变量v的地址是原来的,
        Valhold vh = new Valhold();
        /**
         * 难理解和容易euhui的地方:
         * vh是新 new的对象,地址指向和v不一样,把vh赋值给v,相当于这个变量v的地址指向是vh的地址指向了;
         * 所以another方法v的值的改变不会影响原来new的v的值,因为此刻的v变量地址指向的是新new的vh的地址;
         * 但是amethod方法里的ne的v地址指向是原来的地址,没有人对他的值做改变;
         *
         * 说明: 区别
         * (1)v.i=20;
         * (2)Valhold vh = new Valhold(); v=vh;
         * ------------------------------------------
         * (1)会 改变amethod方法里v.i的值;因为地址指向没有变化;
         * (2)步骤2不会改变amethod方法里v.i的值;因为这里变量v的地址已经不再指向Valhold v = new Valhold();了,
         * 而是指向 :Valhold vh = new Valhold();
         *
         */
        v=vh;
        System.out.println("another  i  ---->" +i);
        System.out.println("another  v.i  ---->" + v.i);
    }
}
class Valhold{
    
    public int i =10;

    @Override
    public String toString() {
        return "Valhold [i=" + i + "]";
    }

 //--------------------------------------------------------------------------------------------------运行结果

another  i  ---->0
another  v.i  ---->10
amethod---->20              //-------------------------------这块的值是本文的重点


    
}
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值