static可以用來修飾方法和屬性,當然代碼塊也是可以的。
1.static方法是類中的一個成員方法,屬于整個類,即使不用創建任何對象也可以直接調用!
static內部只能出現static變量和其他static方法!而且static方法中還不能使用this....等關鍵字..因為它是屬于整個類!
2.靜態方法效率上要比實例化高,靜態方法的缺點是不自動進行銷毀,而實例化的則可以做銷毀。
3.靜態方法和靜態變量創建后始終使用同一塊內存,而使用實例的方式會創建多個內存.
4.實例方法是通過對象名調用的,靜態方法與類關聯而不是與對象名關聯
那么問題來了,static方法是否可以繼承?
來試下面代碼:
package init;
publicclassTestFather {
staticStringm="123";
publicstaticvoidsay() {
System.out.println("parent");
}
package init;
public classTestChild extendsTestFather{
public static void say() {
System.out.println("son");
}
}
package init;
public class Test {
public static void main(String[] args) {
? ? ? ? TestChild a = new TestChild();
? ? ? ? ?TestFather p = a;
? ? ? ? ? System.out.println(a.m);
? ? ? ? ? p.say();
? ? ? ? ?}
}
結果:
123
parent
說明兩個問題:
1.子類對象是可以調用靜態屬性和方法的;
2.子類對于父類的靜態方法進行重寫失敗;
同時還可以發現編譯器對于調用代碼有提示:
更改為類名調用,且皆指向父類;
證明:上面代碼中調用的static方法和屬性實際上都是父類的方法和屬性,子類并未真正繼承過來。
這個從加載類的初始化順序上也可以得到驗證:靜態屬性和方法只加載一次,而非static的方法和屬性每次對象初始化都會被加載。
結論:
****如果某個方法是靜態的,他的行為就不具備多態性!!!!!!!!!!!
static屬性和方法都是不可以被繼承的,而是調用。