遇到一個問題:
如圖所示,在改行中IDE給出warning:
The static method PRint() from the type demo should be accessed in a static way
有三種解決方案:
把text該為demo;把print()方法中的static去掉;把text去掉,直接調用print()方法;簡單來說:
這個是警告,不是錯誤,不影響使用print()方法是static靜態方法,直接使用”類.方法”調用,因為靜態方法在對象創建前就存在了,他的使用不依賴對象是否被創建.非靜態的方法用”對象.方法”的方式,因為他在對象創建前不存在,必須依賴對象的創建后,才能使用由于在本類調用,可以直接使用方法。以下是static方法和實例方法的區別:
● 生命周期(Lifecycle):
靜態方法(Static Method)與靜態成員變量一樣,屬于類本身,在類裝載的時候被裝載到內存(Memory),不自動進行銷毀,會一直存在于內存中,直到JVM關閉。
非靜態方法(Non-Static Method)又叫實例化方法,屬于實例對象,實例化后才會分配內存,必須通過類的實例來引用。不會常駐內存,當實例對象被JVM 回收之后,也跟著消失。
● 在內存中存儲位置
靜態方法和靜態變量創建后始終使用同一塊內存,是連續的。
非靜態方法會存在于內存的多個地方,是離散的。
● 效率
靜態方法的使用效率比非靜態方法的效率高。
● 線程安全
靜態方法是共享代碼段,靜態變量是共享數據段。既然是“共享”就有并發(Concurrence)的問題。
非靜態方法是針對確定的一個對象的,所以不會存在線程安全的問題。
● 使用范圍
靜態方法: ⒈ 有靜態屬性的類,一般會定義靜態方法。 ⒉ 沒有屬性的類,一般會定義靜態方法。 ⒊ 如果一個方法與他所在類的實例對象無關,那么它就應該是靜態的。靜態方法可以被繼承但是不能被覆蓋。
● 總計
如果靜態方法在系統中定義太多,會占用大量的資源,最后造成內存溢出,所以靜態方法不能濫用。如果從線程安全、性能、兼容性上來看,選用實例化方法為宜。
一般來說, 在程序里面,一些使用頻率高的方法就用static 方法、使用頻率低的則用實例方法。
注意:
靜態方法中可以直接調用同類中的靜態成員,但不能直接調用非靜態成員。如果希望在靜態方法中調用非靜態變量,可以通過創建類的對象,然后通過對象來訪問非靜態變量。在普通成員方法中,則可以直接訪問同類的非靜態變量和靜態變量。靜態方法中不能直接調用非靜態方法,需要通過對象來訪問非靜態方法。新聞熱點
疑難解答