類方法 例項方法和靜態方法

2022-08-31 06:54:08 字數 2169 閱讀 6265

objective-c中非常重要的語法知識,在此歸納總結一下。

類方法,也稱靜態方法,指的是用static關鍵字修飾的方法

此方法屬類本身的方法,不屬於類的某乙個例項(物件)。類方法中不可直接使用例項變數。其呼叫方式有三種:可直接呼叫、類名.方法名、物件名.方法名。

例項方法指的是不用static關鍵字修飾的方法

。每個例項物件都有自身的例項方法,互相獨立,不共享乙個。其呼叫方式只能是物件名.方法名。

用修飾符static宣告的方法為靜態方法,不用修飾符static宣告的方法為例項方法

管類生成或未生成物件,類的靜態方法都可以被使用,使用格式為:類名.靜態方法名。靜態方法只能使用該靜態方法所在類的靜態資料成員和靜態方法。這是因為

使用靜態方法時,該靜態方法所在類可能還沒有物件,即使有物件,由於用類名.靜態方法名方式呼叫靜態方法,靜態方法沒有this指標來存放物件的位址,無

法判定應訪問哪個物件的資料成員。在類建立物件後,例項方法才能被使用,使用格式為:物件名.例項方法名。例項方法可以使用該方法所在類的所有靜態成員和例項成員

何時用靜態方法,何時用例項方法?

先說例項方法,當你給乙個類寫乙個方法,如果該方法需要訪問某個例項的成員變數時,那麼就將該方法定義成例項方法。一類的例項通常有一些成員變數,其中含有該例項的狀態資訊。而該方法需要改變這些狀態。那麼該方法需要宣告成例項方法

靜態方法正好相反,它不需要訪問某個例項的成員變數,它不需要去改變某個例項的狀態我們把該方法定義成靜態方法

關於靜態方法和例項方法的一些誤區。

一、靜態方法常駐記憶體,例項方法不是,所以靜態方法效率高但佔記憶體

事實上,方法都是一樣的,在載入時機和占用記憶體上,靜態方法和例項方法是一樣的,在型別第一次被使用時載入。呼叫的速度基本上沒有差別。

二、靜態方法在堆上分配記憶體,例項方法在堆疊上

事實上所有的方法都不可能在堆或者堆疊上分配記憶體,方法作為**是被載入到特殊的**記憶體區域,這個記憶體區域是不可寫的。

三、例項方法需要先建立例項才可以呼叫,比較麻煩,靜態方法不用,比較簡單。

事實上如果乙個方法與他所在型別的例項無關,那麼它就應該是靜態的,決不會有人把它寫成例項方法。所以所有的例項方法都與例項有關,既然與例項有關,那

麼建立例項就是必然的步驟,沒有麻煩簡單一說。實際上上你可以把所有的例項方法都寫成靜態的,將例項作為引數傳入即可。

有些方法看似與所在的例項無關,如icomparer.compare方法,但實際上每乙個實現這個介面的類都只會負責自己型別例項的比較,這是c#1.x規範中沒有泛型所帶來的歷史遺留問題。

大部分靜態方法是與類的例項有關的,如各種parse方法,他做成靜態的原因是他沒有例項作為引數。其他的大多是出於語義或者其他目的的考慮。

第一種方式, 宣告例項,呼叫例項方法

當乙個類有多個例項,例如學生這個類,例項可以有學生甲,學生乙,學生丙,等等,我們就用第一種方式。在多執行緒的情況下,只要每個執行緒都建立自己的例項,那麼第一種方法通常是執行緒安全的。

第二種方式,通過乙個靜態的例項,去呼叫例項方法

這種情況比較特殊,通常是整個程式裡該類唯一的乙個例項,我們通過呼叫該例項的例項方法來改變該例項的某些狀態。這乙個例項在多執行緒的情況下,通常是執行緒不安全的。除非我們給這個例項加鎖。防止其他執行緒訪問該例項。

第三種方式,直接呼叫靜態方法

這種情況下靜態方法不需要去改變某個例項的狀態。只要得到少量的引數就可完成既定事情。比如判斷乙個檔案是否存在,只要給個檔案路徑和檔名,就能知道該檔案是否存在

例項方法 類方法和靜態方法

1 例項方法,即需要通過建立例項 物件 進行呼叫的方法。下方即為例項方法的例子 class person object def init self self.name zs self.age 10 p person print p.name,p.age 2 類方法,即在定義方法時使用 classme...

類方法 例項方法和靜態方法

例項方法 類方法 靜態方法三種方法在記憶體中都屬於類,區別在於呼叫方式不同 例項方法 定義 第乙個引數必須是例項物件,該引數名一般約定為 self 通過它來傳遞例項的屬性和方法 也可以傳類的屬性和方法 呼叫 只能由例項物件呼叫。例項物件可以呼叫例項方法 類方法和靜態方法類方法 定義 使用裝飾器 cl...

python例項方法 類方法和靜態方法

class testclassmethod object method method hoho def init self self.name leon def test1 self print test1 print self classmethod def test2 cls print cls...