簡體   English   中英

為什么Java中的包裝類不像引用類型?

[英]Why wrapper class in Java doesn't behave like a reference type?

我有一個很大的問題需要理解為什么Java中的包裝類不像引用類型那樣。 例:

Integer one = 10;
Integer two = one;
one = 20;
System.out.println(one);
System.out.println(two);

輸出將是:

20

10

我認為這two將是20,就像在這個例子中我創建自己的類:

class OwnInteger {
        private int integer;

        public OwnInteger(int integer) {
            this.integer = integer;
        }

        public int getInteger() {
            return integer;
        }

        public void setInteger(int integer) {
            this.integer = integer;
        }
    }

    OwnInteger one = new OwnInteger(10);
    OwnInteger two = one;
    one.setInteger(20);
    System.out.println(one.getInteger());
    System.out.println(two.getInteger());

那么問題是,Integer包裝類特別嗎? 為什么它的行為與我在我的例子中所表現的一樣?

這正是引用類型的行為。 在你的榜樣, two引用同一個對象作為one在轉讓之后。 但是,重新分配one新對象對two沒有影響,這是您看到的行為。

例如,您將看到與其他引用對象相同的行為

StringBuilder one = new StringBuilder("10");
StringBuilder two = one;
one = new StringBuilder("20");
// two still references StringBuilder with "10"

為了使引用類在更改一個對象時顯示行為也改變另一個,該類需要是可變的 ,如代碼中的OwnInteger類, 並且代碼需要更改對象,而不是重新分配它。 包裝類(如Integer )是不可變的,因此您不會遇到它們的行為。

我以為兩個會是20 ...

不,當你這樣做

Integer two = one;
one = 20;

實際上,您正在為變量one分配一個新對象,而變量two將不會使用這些更改進行更新...

給你的班級OwnInteger

OwnInteger one = new OwnInteger(10);
OwnInteger two = one;
one.setInteger(20);

他們做你想象的,因為onetwo指向相同的參考..

代碼A將等同於

OwnInteger one = new OwnInteger(10);
OwnInteger two = one;
one = new OwnInteger(20); //one.setInteger(20);
one = 20;

使用“拳擊”,實際上相當於:

one = Integer.valueOf(20);

在您的情況下, valueOf方法創建一個新對象並返回該新創建對象的引用,因為之前不存在於緩存中。

對於您自己的類onetwo兩個引用變量都指向同一個對象。

到目前為止,其他答案都至少部分錯誤。 您看到的效果與自動裝箱或可變性無關。 像第一步一樣更改指針並通過像第二步這樣的指針更改對象是完全不同的事情。 更改指針將其指向另一個對象。 您沒有更改兩個指針,因此它們指向不同的對象。 無論可變性或拳擊轉換如何都會發生這種情況

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM