詳解Equals 靜態方法 虛方法,與等號的區別

2021-08-25 14:06:35 字數 2596 閱讀 2404

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 方法。我們向乙個沒有重複物件的集合中新增元素時,集合中存放的往往是...