1.Static用來修飾 一個方法又或者一個成員變量,那么靜態方法和普通方法,靜態變量和成員變量之間又有什么區別呢?
靜態方法和普通方法調用方式的不同
如果是兩個靜態方法,可以直接調用
如果是兩個普通方法,可以直接調用
普通方法可以調用靜態方法
靜態方法卻只能訪問靜態成員
普通方法 可以 對象.方法
靜態方法 則是 類.方法
為什么被staic修飾的方法只能訪問靜態成員?
因為靜態方法在類加載的時候就隨着一起加載了,此時其他成員和方法並沒有初始化,換個理解 static 屬於類,而普通成員和方法屬於對象,對象不一定相同,因此static方法里不能用 super和this
靜態變量和成員變量的區別
生命周期
靜態變量隨類的加載而加載,隨類的銷毀而銷毀
成員變量隨對象的加載而加載,隨對象的銷毀而銷毀
調用方式不同
一個是類調用,一個是對象調用
存儲的位置不同
靜態變量存儲在靜態區,而成員變量保存在堆里
2.Static還可以修飾代碼塊
static{
代碼..
}
靜態代碼塊隨類的加載而加載,而且類存在期間只加載一次
3.Static用來修飾內部類
Static 修飾的內部了不需要先實例一個外部類,可以直接使用外部類.內部類
4.Static可以用來靜態導包
import static XXX.XXX.XXX.靜態方法名 表示導入某個靜態方法
或者import static import static XXX.XXX.XXX.* 表示導入當前類的靜態方法
好處就是可以直接使用方法名,而不需要類.方法
----------------------------------------補充----------------------------------------------------------
關於static修飾符修飾的 方法 內部類 成員變量 代碼塊的加載順序
一定是按順序加載,先加載父類,在加載子類
public abstract class Animal { static{ System.out.println("父類的靜態代碼塊"); } }
public class Test extends Animal{ private static int s = run(); static{ System.out.println("子類的靜態代碼塊"); } static class A{ static { System.out.println("子類的靜態內部類的靜態代碼塊"); } } void sleep(){ System.out.println("子類重寫父類的方法"); } static void eat(){ System.out.println("靜態的吃"); } static int run(){ System.out.println("靜態的跑"); eat(); return 0; } public static void main(String[] args){ new A(); } }
執行結果
按順序加載,先加載父類,在加載子類