用于修飾成員變量和成員函數
隨著類的加載而加載
優先于對象存在
被所有對象所共享
可以直接被類名調用
靜態方法只能訪問靜態成員;非靜態方法也可以訪問靜態成員
靜態方法中不可以寫this,super關鍵字
主函數是靜態的
成員變量隨著對象的創建而存在,隨著對象的回收而釋放;
靜態變量隨著類的加載而存在隨著類的消失而消失
2. 調用方式不同
成員變量只能被對象調用
靜態變量能被對象調用也能被類名調用(一般建議使用類名調用)
3. 別名不同
成員變量也叫實例變量
靜態變量也叫類變量
4. 數據的存儲位置不同
成員變量數據存儲在堆內存中的對象中,所以是對象的特有數據
靜態變量數據存儲在方法區(數據區或共享數據區)的靜態區中,所以也叫對象的共享數據
以下代碼在內存中的執行:
class Person{ PRivate String name; private int age; static String country = "CN"; public Person(String name, int age){ this.name = name; this.age = age; } public void show(){ System.out.println(Person.country+":"+this.name+":"+this.age); } public static void method(){ System.out.println(Person.country); }}class StaticDemo2{ public static void main(String[] args){ Person.method(); Person p = new Person("java",20); p.show(); }}
內存圖解為:
說明:
static { System.out.println("這是靜態代碼塊");}
1.靜態代碼塊
隨著類的加載而執行,并且執行一次。屬于類。
2.作用
用于給類進行初始化。比如像javaAPI提供的Math類,全部為靜態的方法,不允許創建對象,這個時候不能用構造 函數進行初始化,因為構造函數一般是給對象初始化,不能創建對象時不可使用。所以就要使用靜態代碼塊來進行一些初始化的操作。
不同于靜態代碼塊,是屬于類的代碼塊,如:
class Demo{ { System.out.println("這是構造代碼塊"); }
//。。。}
和對象有關
可以給所有對象進行初始化,構造函數是給對應的對象進行針對性的初始化。
每次創建對象時都會執行。靜態代碼塊是在類加載時執行一次。
新聞熱點
疑難解答