包装类是按值传递还是按引用传递?

4

我知道Java是按引用传递的,但只适用于Java对象。但为什么不适用于Java包装类?像Integer、Float、Double这样的包装类是按引用传递还是按值传递的?因为每当我将这些类的对象传递到方法中并更改一些值时,但在该方法之外,我没有获得更新后的值。


4
Java中的参数传递是按值传递。 - SatyaTNV
3
可能是Java是按引用传递还是按值传递?的重复问题。 - childofsoong
1
Java始终按值传递。包装类可能看起来像是按引用传递,但实际上并不是。这是一篇很好的阅读材料。http://javadude.com/articles/passbyvalue.htm - yogidilip
“我知道Java是按引用传递的” - 休斯顿,我们有问题了!这是基本原理,但仍然经常看到一些帖子声称他们“知道”,但他们所谓的“知道”是错误的。在这个领域,我们要么存在教育问题,要么缺乏教育。 - ChiefTwoPencils
我非常好奇您是如何编写一个“更改一些值”的方法在不可变的原始包装器中。您愿意发布一些代码吗? - Mike Nakis
2个回答

10

除了“按值传递”讨论之外,在Java中所有的包装类都是不可变的。它们复制了基本类型的行为。你需要返回最新的值才能看到更改。


是的,如果我返回值,我会得到更新后的值。但是我不明白,即使Java是按引用传递,为什么它不适用于包装类。 - Arvind Chavhan
2
@ArvindChavhan 因为它们是不可变的 :) 阅读有关不可变类的内容。您将会理解:https://en.wikipedia.org/wiki/Primitive_wrapper_class - Suresh Atta
2
@ArvindChavhan Java不是按引用传递的。在Java中,引用是按值传递的。 - Peter Lawrey
1
@PeterLawrey 第10^32次 ;) 相同的句子 :D - Suresh Atta
1
@sᴜʀᴇsʜᴀᴛᴛᴀ 确实。;) - Peter Lawrey
显示剩余2条评论

0
public static void main(String[] args) {        
        Integer i  = 5;
        display(i);
        System.out.println(i);
    }
    
    private static void display(Integer i) {
        i = 10;
    }

The reason why i will not be updated because i=10 will use autoboxing here and it will be similar to i = new Integer(10)

Since i is pointing to a new memory address this change will not appear in main method

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接