簡體   English   中英

Java中布爾和布爾的不同結果

[英]Different results with Boolean and boolean in java

我的代碼未給出正確的結果,我開始進行故障排除並發現了一個奇怪的錯誤,有人可以向我解釋一下。

如果我選擇字段並執行此操作,結果將為result1 == false和result2 == true,為什么?

        MyClass m1 = new MyClass();
        MyClass m2 = new MyClass();

        Field[] fieldsFirst = m1.getClass().getDeclaredFields();
        Field[] fieldsSecond =  m2.getClass().getDeclaredFields();

        for (int i = 0; i < fieldsFirst.length; i++) {

            Field first = fieldsFirst[i];
            Field second = fieldsSecond[i];

            first.setAccessible(true);
            second.setAccessible(true);

            if(first.get(m1) instanceof Boolean)
            {
               boolean b1 = (Boolean)first.get(m1); 
               boolean b2 = (Boolean)second.get(m2);

               //Here are the results
               boolean result1 = b1 != b2; // false
               boolean result2 = (Boolean)first.get(m1) != (Boolean)second.get(m2); // true

            }

如果我有:

public class MyClass {

private boolean myBoolean = true;

public boolean getMyBoolean()
{
return myBoolean;
}
public void setMyBoolean(booelan inBool)
{
myBoolean = inBool;
}

}

boolean result1 = b1 != b2; // false

您正在比較原始值,因為b1b2是從Booleanboolean 拆箱轉換結果。

boolean result2 = (Boolean)first.get(m1) != (Boolean)second.get(m2); // true

您正在比較參考。 每個get()的結果引用了一個不同的對象。 因此, !=比較為true

Boolean是原始boolean的包裝。

包裝器類將數據類型包裝(封裝)並賦予其對象外觀。 在任何需要數據類型作為對象的地方,都可以使用此對象。 包裝器類包括解包裝對象並返回數據類型的方法。

來源: http : //way2java.com/java-lang/wrapper-classes/

與其他對象一樣,如果需要比較它們的值,則需要使用.equals()而不是比較運算符。

這里:

boolean b1 = (Boolean)first.get(m1); 
boolean b2 = (Boolean)second.get(m2);  

您正在將Boolean轉換為boolean 這稱為unboxing conversion ,這是“ AutoBoxing Conversions的一部分。 這些之所以稱為“ Auto是因為Java會自動為您進行轉換。 即使您擺脫了演員表。
因此,您正在比較它們的原始值。
由於原始值相同,因此您的比較結果為true。 因此, false

這里:

boolean result2 = (Boolean)first.get(m1) != (Boolean)second.get(m2);  

您正在比較兩個對象的引用。 由於它們存儲在不同的存儲位置,因此比較結果為true 直觀,不是嗎? 不同的對象,不同的內存位置?

如果您確實需要比較兩個對象的值,請使用equals()方法。 但是,對於Wrapper對象,請閉上眼睛,將其拆箱為其原始值,然后進行比較。

就像喬什·布洛赫(Josh Bloch)在《有效的Java: 比較包裝程序》中所建議的那樣 開箱吸盤!
比較有效的Java而言,如果比較運算符具有大於或小於的附加符號,則適用於Wrapper類。 <<=>>=產生正確的結果,即使您未取消裝箱。 ==!=不會產生正確的結果

比較boolean result1 = b1 != b2是原始值比較,因此您可以使用==或!=之類的運算符。

比較boolean result2 = (Boolean)first.get(m1) != (Boolean)second.get(m2)是對象比較,因此您不是在比較值,而是在引用。 您應該使用equals()比較它們

boolean result2 = ((Boolean)first.get(m1)).equals((Boolean)second.get(m2))

暫無
暫無

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

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