static關(guān)鍵字的三大作用:
(推薦教程:java入門教程)
static靜態(tài)成員變量
static靜態(tài)成員方法
static靜態(tài)代碼塊
分析:
1、static靜態(tài)成員變量
說明:如果一個(gè)成員變量使用了static關(guān)鍵字,那么這個(gè)變量不再屬于對(duì)象自己,而是屬于所在類。多個(gè)對(duì)象共享同一份數(shù)據(jù)。
代碼舉例說明:
我們建一個(gè)Student學(xué)生類,設(shè)置room教室和idCounter兩個(gè)靜態(tài)成員變量。在main()方法中實(shí)例化兩個(gè)學(xué)生對(duì)象one和two,只給one對(duì)象的room賦值,打印輸出的時(shí)候會(huì)發(fā)現(xiàn)此時(shí)two.room的值和one.room的值一樣。
可以看出,因?yàn)閞oom使用了static關(guān)鍵字,所以它屬于類,不再屬于對(duì)象自己,可以被多個(gè)對(duì)象所共享一。因?yàn)閕dCounter是一個(gè)靜態(tài)變量,只會(huì)初始化一次,所以,每創(chuàng)建一個(gè)對(duì)象id都會(huì)自增長(zhǎng)1。
public class Demo01StaticField { public static void main(String[] args) { Student one=new Student("郭靖",19); Student two=new Student("黃蓉",16); one.room="101教室"; System.out.println("姓名:"+one.getName()+",年齡:" +one.getAge()+",教室:"+one.room +",學(xué)號(hào):"+one.getId()); //姓名:郭靖,年齡:19,教室:101教室,學(xué)號(hào):1 System.out.println("姓名:"+two.getName() +",年齡:"+two.getAge()+",教室:"+two.room +",學(xué)號(hào):"+two.getId()); //姓名:黃蓉,年齡:16,教室:101教室,學(xué)號(hào):2 } } public class Student { private int id; //學(xué)號(hào) private String name; //姓名 private int age; //年齡 static String room; //所在教室 private static int idCounter=0; //學(xué)號(hào)計(jì)數(shù)器,每當(dāng)new了一個(gè)新對(duì)象的時(shí)候,計(jì)數(shù)器++ public Student() { this.id= ++idCounter; } public Student(String name, int age) { this.name = name; this.age = age; this.id= ++idCounter; } public int getId() { return id; } public void setId(int id) { this.id = id; } //name和age的Getter,Setter方法同上id,省略 }
2、static靜態(tài)成員方法
說明:如果一個(gè)成員方法使用了static關(guān)鍵字,同樣,那么這就成為了靜態(tài)方法。靜態(tài)方法不屬于對(duì)象,而是屬于類的。
static修飾成員方法的優(yōu)點(diǎn):避免了new對(duì)象的繁瑣和資源的消耗,可以直接通過【類名.方法名】來使用。
代碼舉例說明:
新建一個(gè)Myclass類,里面有一個(gè)成員變量,一個(gè)靜態(tài)成員變量,一個(gè)成員方法,一個(gè)靜態(tài)成員方法。我們可以看到,成員方法既可以訪問成員變量也可以訪問靜態(tài)變量。而靜態(tài)方法只能訪問靜態(tài)變量,不能訪問非靜態(tài),也不能使用this關(guān)鍵字。在使用該類的時(shí)候,有了static關(guān)鍵字,那么不需要?jiǎng)?chuàng)建對(duì)象,直接就能通過類名稱來使用它。對(duì)于本類當(dāng)中的靜態(tài)方法,可以省略類名稱。
public class Demo02StaticMethod { public static void main(String[] args) { //非靜態(tài)方法使用:1.首先創(chuàng)建對(duì)象 MyClass obj=new MyClass(); //2.然后才能使用沒有static關(guān)鍵字的方法 obj.method(); //對(duì)于靜態(tài)方法來說,可以通過對(duì)象名進(jìn)行調(diào)用,也可以通過類名稱來調(diào)用。 obj.methodStatic(); //正確,不推薦,這種寫法也會(huì)被javac翻譯成“類名稱.靜態(tài)方法名” MyClass.methodStatic(); //正確,推薦 //對(duì)于本類當(dāng)中的靜態(tài)方法,可以省略類名稱 myMethod(); Demo02StaticMethod.myMethod(); //完全等效 } public static void myMethod(){ System.out.println("自己的方法!"); } } public class MyClass { int num; //成員變量 static int numStatic; //靜態(tài)變量 //成員方法 public void method(){ System.out.println("這是一個(gè)普通的成員方法。"); //成員方法可以訪問成員變量 System.out.println(num); //成員方法可以訪問靜態(tài)變量 System.out.println(numStatic); } //靜態(tài)方法 public static void methodStatic(){ System.out.println("這是一個(gè)普通的靜態(tài)方法。"); //靜態(tài)方法可以訪問靜態(tài)變量 System.out.println(numStatic); //靜態(tài)不能直接訪問非靜態(tài)【重點(diǎn)】 //System.out.println(num); //錯(cuò)誤寫法 //靜態(tài)方法中不能使用this關(guān)鍵字 //System.out.println(this); //錯(cuò)誤寫法 } }
(學(xué)習(xí)視頻推薦:java課程)
3、static靜態(tài)代碼塊
格式:
public class 類名稱{ static{ //靜態(tài)代碼塊的內(nèi)容 } }
特點(diǎn):當(dāng)?shù)谝淮斡玫奖绢悤r(shí),靜態(tài)代碼塊執(zhí)行唯一的一次,可以用來優(yōu)化程序性能。我們大多數(shù)情況下,會(huì)將一些只會(huì)執(zhí)行一次的初始化操作(初始化靜態(tài)資源)的代碼放在static代碼塊中,例如:加載配置文件等。注意:靜態(tài)內(nèi)容總是優(yōu)先于非靜態(tài),所以靜態(tài)代碼塊比構(gòu)造方法先執(zhí)行。
public class Demo04StaticCode { public static void main(String[] args) { Person one=new Person(); System.out.println("************************"); //無論創(chuàng)建幾個(gè)Person對(duì)象,靜態(tài)代碼塊只執(zhí)行一次 Person two=new Person(); } } public class Person { static{ System.out.println("靜態(tài)代碼塊執(zhí)行!"); } public Person() { System.out.println("構(gòu)造方法執(zhí)行!"); } }
執(zhí)行結(jié)果: