JAVA基礎(49)---static及static修飾變數
阿新 • • 發佈:2018-11-19
static
所解決的問題
這裡摘錄一下《Java程式設計思想(第四版)》(《Java核心技術Ⅰ卷/Ⅱ卷》)裡關於static關鍵字的一段原話:(P29)通常來說,當建立類時,就是在描述那個類的物件的外觀與行為 。除非用new建立那個物件,否則,實際上並未獲得任何物件。執行new來建立物件的時候,資料儲存空間才被分配,其方法才供外界呼叫。有兩種情形用上述方法是無法解決的。一種情形是,只想為某特定域分配單一儲存空間,而不去考慮究竟要建立多少個物件,甚至根本不需要建立任何物件。另一種情形是,希望某個方法不與包含他的類的任何物件關聯在一起。也就是說,即使沒有建立物件,也能夠呼叫方法。
簡單來說,static的主要目的 就是建立獨立於具體物件的域變數與方法。
static 的使用
static可以修飾方法,還可以修飾變數、程式碼塊
static所修飾的方法和變數的特點
- 屬於當前類所有,與物件無關
- 呼叫方式:不需要建立物件就能夠直接使用,可以通過類名.屬性名/類名.方法名()
- 儲存空間:存在與方法區中靜態區
package org.lanqiao.staticdemo; public class CountObject { public static void main(String[] args) { Person p1 = new Person(); System.out.println("Person類的物件的數量為:" + Person.objNum()); Person p2 = new Person(); System.out.println("Person類的物件的數量為:" + Person.objNum()); Person p3 = new Person("張三" ,20); System.out.println("Person類的物件的數量為:" + Person.objNum()); System.out.println("Person類的物件的數量為:" + Person.objNum()); System.out.println("Person類的物件的數量為:" + Person.objNum()); } } /* * 統計person類建立物件的個數 */ class Person{ private String name; private int age; static int objNum = 0 ; public Person() { objNum++; } public Person(String name, int age) { this.name = name; this.age = age; objNum++; } public String getName() { return name; } public void setName(String name) { this.name = name; } public int getAge() { return age; } public void setAge(int age) { this.age = age; } }
使用static所修飾的變數是屬於當前類所有,是所有物件所共有的。
使用static所修飾的變數是隨著類的載入而載入;而我們的成員變數 是隨著物件的建立而建立
對於靜態的變數的訪問方式:類名.屬性名
靜態變數隨著類的載入而建立,所以在Person載入到class區時,在靜態區就已經建立了bojNum,當p1要進行訪問時,底層實現其實是從class區Person儲存的一個靜態地址訪問到的靜態區。