其中s.age为什么不是9999而输出了77777。老师说stu.new Student();是什么搬家操作,如果那段没注释s.age就变成9999了。搞不懂这是怎么赋值的机智。求前辈指导,本人比较梗

解决方案 »

  1.   

    搬家操作是什么玩意???Student是堆内存地址的拷贝,如果没有stu=new Student();stu.age是直接对s指向的对象进行操作,s的内容被赋值为7777,所以输出7777,如果有stu=new Student();,对象重新指向一个新的对象,没有对s进行修改,所以还是9999
      

  2.   

    主要用到的知识是java中的值传递和引用传递,基本数据类型比如int,long,short等在函数方法中传递时,会拷贝一份传入,也就是说传递后就和之前的互不相关了。引用传递时对象而言的,传递引用的地址,也就是变量所对应的内存空间的地址,传递前和传递后这块内存空间都指向同一个引用,值发生变化。
      

  3.   

    int就是直接在栈里面,所以不管i付给什么值num都不改变是么
      

  4.   

    num是在主函数中,而i的生命周期就是在你那个成员方法执行完就结束了,i所在的方法加载完就弹栈了,建议楼主好好了解下程序执行在jvm中的顺序
      

  5.   

    虽然程序把把num和s.age赋值传进了change(Student stu,int i)了,但是方法内部又对这两个值重新赋值,那么main方法中所赋值就跟这个方法没有什么关系了。输出的就还是change(Student stu,int i)里面的值了。
      

  6.   

    建议看一下相关的一些东西:Java中的内存分配(只用看看堆,栈,常量池就好),尤其是关于引用类形变量的内存;Java参数传递的过程,尤其是引用类型的传递;变量的作用域和Java中方法的执行过程(这个作为了解)