object st1 = 1;
object st2 = 1;
console.writeline(equals(st1, st2));
console.writeline(st1.equals(st2));
console.writeline(st1 == st2);
console.writeline("------------------------------------");
object st3 = 1;
object st4 = 1;
console.writeline(equals(st3, st4));
console.writeline(st3.equals(st4));
console.writeline(st3 == st4);
console.writeline("------------------------------------");
object st5 = null;
object st6 = 1;
console.writeline(equals(st5, st6));
// console.writeline(st5.equals(st6));//這一句會報異常,注釋掉
console.writeline(st5 == st6);
console.writeline("------------------------------------");
object st7 = 1;
object st8 = st7;
console.writeline(equals(st7, st8));
// console.writeline(st7.equals(st8));//這一句會報異常,注釋掉
console.writeline(st7 == st8);
執行結果:
true
true
false
------------------------------------
true
true
false
------------------------------------
false
false
------------------------------------
true
true
請按任意鍵繼續. . .
這一段結果說明:等號比較的是兩個的引用,即他們引用的是否是同一物件。
equals()的靜態方法和虛方法都比較的是值,只需要判斷值是否相同就行了。但是equals靜態方法可以傳值null,如果是虛方法就會報異常。靜態方法執行的之後只是將null報錯的狀態去掉了,最後還是執行的虛方法,所以如果重寫虛方法,靜態方法的結果也會跟隨改變,下面會驗證;
注意一點:string型別是特殊的引用型別,一般都是將其當作值型別使用,string不管是等號比較還是equals比較都是比較值,string比較的時候等號比較會被重寫,實際上是用equasl比較的。(這裡不做驗證,在此部落格已有大佬做過了驗證)
有一種引用型別的比較需要重寫equasl方法:
pe p1 = new pe();
p1.name = "1";
pe p2 = new pe();
p2.name = "1";
console.writeline(p1.equals(p2));
console.writeline(equals(p1,p2));
若pe類中沒有重寫equals方法,則返回值為false,fanlse,
false
false
請按任意鍵繼續. . .
為什麼呢,不是說引用型別equasl比較的是值嗎,與位址無關怎麼會是false,
這是因為父類的equals不知道pe類有哪些字段,無法將他們進行比較。這時就需要在pe類裡面重寫equasl方法了
class pe
public override bool equals(object o)
else
}}
現在equasl方法返回的結果就是true,true了
true
true
請按任意鍵繼續. . .
(也驗證了上面所說:靜態方法實際上執行的是虛方法)
上面所說都是引用型別的,值型別的比較一般使用equasl比較,因為值型別一般只需要比較值。如果乙個值型別的結構等號比較的話會報錯。說到值型別比較這裡說一下referenceequals()方法,此方法跟等號比較一樣,都是比較引用。如果把這個方法拿來比較值型別不管值想不想等都會返回false。值型別在使用referenceequals()和equasl()方法比較的時候,值型別會被裝箱,也就是轉換成引用型別,這時候比較的兩個值型別的記憶體位址就不會一樣,如果使用referenceequals就會一直返回false。所以說值型別一般使用equals方法比較。必要時重寫equals方法。
虛方法virtual詳解
從c 的程式編譯的角度來看,它和其它一般的函式有什麼區別呢?一般函式在編譯時就靜態地編譯到了執行檔案中,其相對位址在程式執行期間是不發生變化的,也就是寫死了的!而虛函式在編譯期間是不被靜態編譯的,它的相對位址是不確定的,它會根據執行時期物件例項來動態判斷要呼叫的函式,其中那個申明時定義的類叫申明類,...
重寫equals方法
對於重寫equals方法有以下例子 object類中的常用方法。object類是所有類的根類,定義了所有物件都具備的功能。api 應用程式介面 文件 class person extends object 判斷是否是同齡人。這個方法也是在比較兩個person物件是否相等。注意 person類中是否有...
equals方法重寫
來自的文章 一 為什麼equals 方法要重寫?判斷兩個物件在邏輯上是否相等,如根據類的成員變數來判斷兩個類的例項是否相等,而繼承object中的equals方法只能判斷兩個引用變數是否是同乙個物件。這樣我們往往需要重寫equals 方法。我們向乙個沒有重複物件的集合中新增元素時,集合中存放的往往是...