【Java程式設計基礎】——Java中Static關鍵字的使用
文章轉自http://www.cnblogs.com/dolphin0520/p/3799052.html
1.static關鍵字的用途
“static方法就是沒有this的方法。在static方法內部不能呼叫非靜態方法,反過來是可以的。而且可以在沒有建立任何物件的前提下,僅僅通過類本身來呼叫static方法。這實際上正是static方法的主要用途。”
2.static修飾類的成員變數
static變數也稱作靜態變數,靜態變數和非靜態變數的區別是:靜態變數被所有的物件所共享,在記憶體中只有一個副本,它當且僅當在類初次載入時會被初始化。而非靜態變數是物件所擁有的,在建立物件的時候被初始化,存在多個副本,各個物件擁有的副本互不影響。static成員變數的初始化順序按照定義的順序進行初始化。
3.static修飾類的成員方法
static方法一般稱作靜態方法,由於靜態方法不依賴於任何物件就可以進行訪問,因此對於靜態方法來說,是沒有this的,因為它不依附於任何物件,既然都沒有物件,就談不上this了。並且由於這個特性,在靜態方法中不能訪問類的非靜態成員變數和非靜態成員方法,因為非靜態成員方法/變數都是必須依賴具體的物件才能夠被呼叫。但是要注意的是,雖然在靜態方法中不能訪問非靜態成員方法和非靜態成員變數,但是在非靜態成員方法中是可以訪問靜態成員方法/變數的。
4.類中的靜態程式碼塊
static關鍵字還有一個比較關鍵的作用就是 用來形成靜態程式碼塊以優化程式效能。static塊可以置於類中的任何地方
5.簡單示例
Student類
package cn.york.statictest; public class Student { private String sno; static String className; private String name; public String getSno() { return sno; } public void setSno(String sno) {this.sno = sno; } public static String getClassName() { return className; } public static void setClassName(String className) { Student.className = className; } public String getName() { return name; } public void setName(String name) { this.name = name; } public Student() { } public Student(String sno,String className,String name) { this.sno = sno; this.className=className; this.name=name; } //靜態方法 public static void sayHi() { //靜態方法中不能訪問非靜態成員 //System.out.println("say hi! my sno is"+sno); //靜態方法中只能訪問該類中使用static修飾的成員 System.out.println("say hi! my class is "+className); } //靜態程式碼塊,只在類載入的時候執行一次 static{ System.out.println("我是Student類中的靜態程式碼塊!只在類載入的時候執行一次"); } }
test類
package cn.york.statictest; public class test { public static void main(String[] args) { Student s1 = new Student(); Student s2 = new Student("1002","軟體2班","張三"); //static關鍵字修飾類的成員變數時,該類的所有物件共享該變數 System.out.println(s2.getClassName()); System.out.println(s1.getClassName()); //s1物件修改後,s2物件的該屬性隨之改變 s1.setClassName("軟體4班"); System.out.println(s2.getClassName()); /*static關鍵字修飾類的成員方法時, *既可以直接使用類名.方法名的方式來訪問; *也可以使用物件名.方法名的方式來訪問*/ Student.sayHi(); s1.sayHi(); s2.sayHi(); } }
執行結果:
6.static關鍵使用注意事項
6.1static關鍵字不會改變類成員的訪問屬性
類的成員使用private修飾時,類的例項是無法訪問類中的私有成員的,這說明static關鍵字並不會改變變數和方法的訪問許可權。
6.2this關鍵字是否能訪問靜態成員變數
public void printclassName() { System.out.println(this.className); } public static void main(String[] args) { Student s1 = new Student("1002","軟體2班","張三"); s1.printclassName(); }
執行結果
在非靜態方法中能夠通過this訪問靜態成員變數。
3.static能作用於區域性變數麼?
在C/C++中static是可以作用域區域性變數的,但是在Java中切記:static是不允許用來修飾區域性變數,這是Java語法的規定。
具體原因可以參考這篇博文的討論:http://www.debugease.com/j2se/178932.html
參考文章: