static關鍵字是今天下午看的主要內容, static關鍵字是this之外的又一痛點, 因此也是單獨羅列出來做下筆記.
static關鍵字應用點有3個: static變數(屬性)的聲明及引用、static方法的聲明及引用以及static代碼塊的使用. 貌似靜態代碼塊的使用機會比較少,這塊跨過~ 主要筆記下前面兩個部分.
1. static 屬性(變數)的聲明及引用
static屬性是指把公用屬性(也就是說,所有對象都一樣的那個屬性)單獨列出來,用static加以靜態化的屬性. 這裡需要先解釋下, 為什麼需要靜態屬性.
先看下面的例子代碼:
class Person{// 為了方便,屬性暫時不封裝String name ;int age ;// 所在的城市預設是為南京String city = "南京" ;public Person(String name,int age){this.name = name ;this.age = age ;}public String getInfo(){return "姓名:"+name+",年齡:"+age+",城市:"+city ;}}public class Demo01{public static void main(String args[]){Person p1 = new Person("張三",30) ;Person p2 = new Person("李四",31) ;Person p3 = new Person("王五",32) ;System.out.println(p1.getInfo()) ;System.out.println(p2.getInfo()) ;System.out.println(p3.getInfo()) ;}}
這裡分析下上面例子在記憶體中的佔用情況, 如:
從中可以看出,三個對象中都有一個一模一樣的屬性city="南京",這樣的設計就會存在問題:
(1). 屬性的內容重複存在,所有對象都有此屬性;
(2). 如果現在假設南京變為北京了,假設已經產生了100000個對象,則此時如果要修改其所在城市屬性的內容,則肯定要修改100000遍.
解決方案:
所有的對象都共同指向同一個city屬性是最好的,有一個對象將city屬性修改了,則其他的也會受影響。此時就需要使用static標識city屬性了。執行個體圖如下:
使用static關鍵字聲明類屬性的例子如下,在該例子中,通過類名稱.static屬性的格式去訪問並修改static屬性.這在下面會接著說到.
class Person{//方便起見,暫時不封裝String name;int age;static String bornCity = "寧波";public Person(String name,int age){this.name = name;this.age = age;}public String getInfo(){return "姓名: "+name+",年齡: "+age+",籍貫: "+bornCity;}}class OODemo06{public static void main(String args[]){Person p1 = new Person("邵逸夫",60);Person p2 = new Person("包玉剛",61);Person p3 = new Person("蔣介石",63);System.out.println("---------------------修改籍貫之前-------------------------");System.out.println("\t|-"+p1.getInfo());System.out.println("\t|-"+p2.getInfo());System.out.println("\t|-"+p3.getInfo());System.out.println("---------------------修改籍貫之前-------------------------");//通過類名稱.static屬性的格式去修改屬性Person.bornCity = "北京";System.out.println("\t|-"+p1.getInfo());System.out.println("\t|-"+p2.getInfo());System.out.println("\t|-"+p3.getInfo());}}
在上面例子中,訪問static屬性,採取了如下方式: 類名稱.static屬性名稱, 這就是說,我們可以直接由類名稱對static屬性進行訪問,因此使用了static的屬性又被稱為類屬性(或者說類變數).
2. static方法的聲明及引用
與static屬性一樣, static修飾方法,也可以直接由類名稱直接存取. 例子可以參照下面程式,注意注釋部分:
class Person{String name;int age;static String bornCity = "寧波";//只編寫一個可以修改bornCity屬性的方法public static void setBornCity(String city){//this是當前對象,而static屬性是隸屬全類的,不是某個對象,所以不能用this關鍵字//this.bornCity = city;bornCity = city;}public Person(String name,int age){this.name = name;this.age = age;}public String getInfo(){return "姓名: "+name+",年齡: "+age+",籍貫: "+bornCity;}}class OODemo07{public static void main(String args[]){Person p1 = new Person("邵逸夫",60);Person p2 = new Person("包玉剛",61);Person p3 = new Person("蔣介石",63);System.out.println("---------------------修改籍貫之前-------------------------");System.out.println("\t|-"+p1.getInfo());System.out.println("\t|-"+p2.getInfo());System.out.println("\t|-"+p3.getInfo());System.out.println("---------------------修改籍貫之前-------------------------");//通過類名稱.static屬性的格式去修改屬性//Person.bornCity = "北京";//使用static聲明的方法,可以直接用類名稱.方法()的格式調用Person.setBornCity("北京");System.out.println("\t|-"+p1.getInfo());System.out.println("\t|-"+p2.getInfo());System.out.println("\t|-"+p3.getInfo());}}
這個程式需要注意的是,在static方法中,是不能夠使用this關鍵字的. 因為static屬性是隸屬於全類而不是某個正在使用的執行個體化對象, 而this代表的是當前對象.
接下來,分別分析下static方法與static屬性的訪問關係,以及static方法之間的調用關係
2.1 static方法與static屬性之間的關係
這裡需要總結一下static方法/非static方法 可否訪問 static屬性/非static屬性的關係:
由此可見,static屬性可以被static方法和非static方法訪問; 但是非static屬性只能被非static方法訪問,不能被static方法訪問!
2.2 static方法與static方法之間的關係
這裡只需要記住一句話: static方法只能直接調用static方法,否則只能通過執行個體化對象(new對象)來訪問該方法. 這裡最典型的例子是main方法的調用. 我們知道,main方法是static方法, 在main方法中要調用非static方法的話,必須要先執行個體化一個該方法所在類的對象,通過該執行個體化對象去調用方法. 如果該方法是static方法,main函數即可直接調用,不需再執行個體化類對象了~
例如下面的代碼, main方法只能通過執行個體化對象來調用方法fun(). 若fun()是定義為static的話, 就無需再new Demo()來執行個體化對象了...
public class Demo09{// static類型的方法只能調用static類型的方法public static void main(String args[]){new Demo09().fun() ;}public void fun(){System.out.println("HELLO WORLD!!!") ;}}