一、在加載時機和佔用內存上,靜態方法和實例方法是同樣的,在類型第一次被使用時加載。調用的速度基本上沒有差異。
二、方法不可能在堆或者堆棧上分配內存,方法做爲代碼是被加載到特殊的代碼內存區域,這個內存區域是不可寫的。
方法佔不佔用更多內存,和它是否是static沒什麼關係。
由於字段是用來存儲每一個實例對象的信息的,因此字段會佔有內存,而且由於每一個實例對象的狀態都不一致(至少不能認爲它們是一致的),因此每一個實例對象的全部字段都會在內存中有一分拷貝,也由於這樣你才能用它們來區分你如今操做的是哪一個對象。
但方法不同,不論有多少個實例對象,它的方法的代碼都是同樣的,因此只要有一份代碼就夠了。所以不管是static仍是non-static的方法,都只存在一份代碼,也就是隻佔用一分內存空間。
一樣的代碼,爲何運行起來表現卻不同?這就依賴於方法所用的數據了。主要有兩種數據來源,一種就是經過方法的參數傳進來,另外一種就是使用class的成員變量的值……
三、若是一個方法與他所在類的實例對象無關,那麼它就應該是靜態的,而不該該把它寫成實例方法。因此全部的實例方法都與實例有關,既然與實例有關,那麼建立實例就是必然的步驟,沒有麻煩簡單一說。安全
固然你徹底能夠把全部的實例方法都寫成靜態的,將實例做爲參數傳入便可,通常狀況下可能不會出什麼問題。性能
從面向對象的角度上來講,在抉擇使用實例化方法或靜態方法時,應該根據是否該方法和實例化對象具備邏輯上的相關性,若是是就應該使用實例化對象 反之使用靜態方法。這只是從面向對象角度上來講的。線程
若是從線程安全、性能、兼容性上來看 也是選用實例化方法爲宜。對象