咱們常常在Java中使用static關鍵字,那麼這麼關鍵字究竟有哪些用途呢?咱們一一道來。java
1.用static修飾變量與方法
測試
public class Main{ private static Object; public static void fun(){ System.out.println("Test Static"); } }
從以上代碼中咱們就見到static的最基本用法,也就是修飾變量和方法。那麼咱們確定有疑惑,這個static關鍵字修飾後與普通的變量就什麼不一樣的呢?spa
Static關鍵字表明依賴的對象是Main.class這個對象,而普通的沒有static修飾的方法或者變量則依賴的是new Main()後生成的對象,因此從本質上來講二者的依賴是不同的。
code
咱們常常遇到的問題是在static 方法裏面不能直接調用非static的變量以及方法,而在普通方法裏面卻能夠調用static方法,爲什麼呢?
orm
這就跟類的加載順序有必定的關係了,首先你在static方法裏面調用非static方法/變量的話是不行的,由於有static修飾的方法會在類的初始化階段就完成了,這個時候非static方法/變量尚未進行賦值,也就是說static修飾的方法先於非static修飾的方法完成,這樣顯然快的是沒有辦法依賴慢的嘍。。可是你反過來調用確實能夠的,道理我相信已經不用我在描述了。
對象
2.用static修飾代碼快接口
public class Main{ static{ System.out.println("static修飾代碼快"); } }
這種用法也是比較常見的用法,用static修飾的代碼塊只會在類進行初始化的時候調用一次!,而非static修飾的代碼塊則是在每次生成對象的時候都進行一次調用。原理我仍是在簡單說一下,由於用static修飾的代碼塊與Main.class所綁定,而Main.class的類信息只會加載一次的,存儲在方法區裏面(JDK1.8之前),因此static塊也只是在加載Main.class的時候進行一次運行過程;而非static的代碼塊就跟隨這新生成的對象來調用,new一個對象就本身調用一次。it
3.用static修飾靜態內部類
class
若是你不須要內部類對象與其外圍類對象之間有聯繫,那你能夠將內部類聲明爲static。這一般稱爲嵌套類(nested class)。Static Nested Class是被聲明爲靜態(static)的內部類,它能夠不依賴於外部類實例被實例化。而一般的內部類須要在外部類實例化後才能實例化。想要理解static應用於內部類時的含義,你就必須記住,普通的內部類對象隱含地保存了一個引用,指向建立它的外圍類對象。然而,當內部類是static的時,就不是這樣了。嵌套類意味着: import
1. 嵌套類的對象,並不須要其外圍類的對象。
2. 不能從嵌套類的對象中訪問非靜態的外圍類對象。
以下所示代碼爲定義一個靜態嵌套類
public class StaticTest{ private static String name = "woobo"; private String num = "X001"; static class Person{ // 靜態內部類能夠用public,protected,private修飾 // 靜態內部類中能夠定義靜態或者非靜態的成員 private String address = "China"; Private Static String x=「as」; public String mail = "kongbowoo@yahoo.com.cn";//內部類公有成員 public void display(){ //System.out.println(num);//不能直接訪問外部類的非靜態成員 // 靜態內部類不能訪問外部類的非靜態成員(包括非靜態變量和非靜態方法) System.out.println(name);//只能直接訪問外部類的靜態成員 //靜態內部類只能訪問外部類的靜態成員(包括靜態變量和靜態方法) System.out.println("Inner " + address);//訪問本內部類成員。 } } public void printInfo(){ Person person = new Person(); // 外部類訪問內部類的非靜態成員:實例化內部類便可 person.display(); //System.out.println(mail);//不可訪問 //System.out.println(address);//不可訪問 System.out.println(person.address);//能夠訪問內部類的私有成員 System.out.println(Person.x);// 外部類訪問內部類的靜態成員:內部類.靜態成員 System.out.println(person.mail);//能夠訪問內部類的公有成員 } public static void main(String[] args){ StaticTest staticTest = new StaticTest(); staticTest.printInfo(); } }
在靜態嵌套類內部, 不能訪問外部類的非靜態成員, 這是由Java語法中"靜態方法不能直接訪問非靜態成員"所限定.注意, 外部類訪問內部類的的成員有些特別, 不能直接訪問, 但能夠經過內部類實例來訪問, 這是由於靜態嵌套內的全部成員和方法默認爲靜態的了.同時注意, 內部靜態類Person只在類StaticTest 範圍內可見, 若在其它類中引用或初始化, 均是錯誤的.
一 . 靜態內部類能夠有靜態成員,而非靜態內部類則不能有靜態成員。
二 . 靜態內部類的非靜態成員能夠訪問外部類的靜態變量,而不可訪問外部類的非靜態變量;
三 . 非靜態內部類的非靜態成員能夠訪問外部類的非靜態變量。
生成一個靜態內部類不須要外部類成員:這是靜態內部類和成員內部類的區別。靜態內部類的對象能夠直接生成:Outer.Inner in = new Outer.Inner();而不須要經過生成外部類對象來生成。這樣實際上使靜態內部類成爲了一個頂級類(正常狀況下,你不能在接口內部放置任何代碼,但嵌套類能夠做爲接口的一部分,由於它是static 的。只是將嵌套類置於接口的命名空間內,這並不違反接口的規則)
4.用static來靜態導包(JDK1.5以後)
public class Util{ public static obj=new Object(); public static void fun(){ System.out.println("測試靜態導包"); } } ------------------------------------------------------ import static Util.obj; import static Util.fun; public class Main{ public static void main(String[] args){ Object o=obj; fun(); } }
以上簡單的代碼中咱們能夠看到靜態導包的好處了,就是能夠省略一部分前綴,可是咱們的平常使用中並不常見這種用法,主要是由於這種導包方式可能在包的數量比較多的時候會引發必定的混亂,致使代碼不易閱讀。
static的做用主要就是以上四種了。