qq_27836205
Jordan裔
2017-09-23 02:52
采纳率: 71.3%
浏览 981
已采纳

java 看到一个java的引用传递和值传递问题

哪位大神知道下面结果是为什么这样的吗?和想象中不一样?四个结果哦 都和我讲一下呗,大神~~~
图片说明

  • 点赞
  • 写回答
  • 关注问题
  • 收藏
  • 邀请回答

5条回答 默认 最新

  • caozhy
    已采纳
     要区分
    
    改变对象本身的状态,比如
    obj.字段  = 123;
    obj.setXXX(123);
    xxx.add(123);
    这些是修改对象状态本身
    
    和改变对象引用对对象的指向
    obj = new XXX();
    obj = obj2;
    这些事让obj指向一个新的对象。
    
    在函数里,通过参数修改一个对象状态,那么会反应到实参上
    将参数指向一个新的对象,不会。
    
    点赞 评论
  • qq_20173969
    七年哥哥 2017-09-23 03:11

    值传递不改变值,因为在内存中就没有开辟一个新的空间,所以还是原来的值。那么引用传递反之

    点赞 评论
  • hmd_989898
    hmd_989898 2017-09-23 03:38

    在 Java 应用程序中永远不会传递对象,而只传递对象引用。因此是按引用传递对象。但重要的是要区分参数是如何传递的,这才是该节选的意图。Java 应用程序按引用传递对象这一事实并不意味着 Java 应用程序按引用传递参数。参数可以是对象引用,而 Java 应用程序是按值传递对象引用的。
    Java 应用程序中的变量可以为以下两种类型之一:引用类型或基本类型。当作为参数传递给一个方法时,处理这两种类型的方式是相同的。两种类型都是按值传递的;没有一种按引用传递。
    按 值传递意味着当将一个参数传递给一个函数时,函数接收的是原始值的一个副本。因此,如果函数修改了该参数,仅改变副本,而原始值保持不变。按引用传递意味 着当将一个参数传递给一个函数时,函数接收的是原始值的内存地址,而不是值的副本。因此,如果函数修改了该参数,调用代码中的原始值也随之改变。
    当传递给函数的参数不是引用时,传递的都是该值的一个副本(按值传递)。区别在于引用。在 C++ 中当传递给函数的参数是引用时,您传递的就是这个引用,或者内存地址(按引用传递)。在 Java 应用程序中,当对象引用是传递给方法的一个参数时,您传递的是该引用的一个副本(按值传递),而不是引用本身。
    Java 应用程序按值传递所有参数,这样就制作所有参数的副本,而不管它们的类型。

    点赞 评论
  • chenbaige
    legendCoder 2017-09-23 04:00

    值传递:改变的恶事change方法中新声明的变量s1和s2的值。而不改变原始的s1和s2的值。change方法中s1和s2作用范围只在方法内有效。

    引用传递:是直接将sb1和sb2的内存地址传递给change方法,这时change方法内的sb1和sb2也指向这个内存地址,改变的也是这个内存地址中的值,所以会改变。

    点赞 评论
  • loufj1178
    loufj1178 2017-09-23 08:00

    补充一下,这个其实还和java中String、StringBuffer 有关。String不可变字符串,所有的修改都是创建新对象。StringBuffer是可变字符串,
    修改都是在原对象基础上的。
    java中String就是个奇葩。别看声明、修改像个基本数据类型,这其实是个引用类型。实际上String s1="hello",应该是String s1 = new String("hello")
    这种表达方式。而s2=s1+s2这种是不能用于其他引用类型的,除了String。java把一个引用类型,弄得像个基本类型,还把算术运算符+用于字符串拼接,也是6得不行·······

    点赞 评论

相关推荐