static是一個靜態修飾符關鍵字,表示靜態的意思,①方便在沒有建立對象的狀況下進行調用。能夠修飾類、方法、變量以及代碼塊。函數
【註釋①】一般來講,當建立類時,就是在描述那個類的對象的外觀和行爲。除非用new建立那個類的對象,不然實際上並未得到任何對象。執行new來建立對象時,數據存儲空間才被分配,其方法才供外界調用。即,不須要建立對象而直接經過類名進行訪問。this
當一個方法或者變量須要初始化加載,或者是常常被調用的時候能夠加上static.用static修飾的方法能夠用類名直接調用,不用必定要先實例化一個對象而後才能夠調用。3d
在Java中,static通常用來修飾成員變量或者函數。但有一種特殊用法是用static修飾內部類(普通類是不容許聲明爲靜態的,只有內部類才能夠),被static修飾的內部類能夠直接做爲一個普通類來使用,而不需實例一個外部類。code
class OuterClass { public static class InnerClass { InnerClass() { System.out.println("InnerClass Class"); } public void Method() { System.out.println("InnerClass Method"); } } } public class StaticClassTest01 { public static void main(String[] args) { // 不須要new一個OuterClass new OuterClass.InnerClass(); new OuterClass.InnerClass().Method(); } }
須要注意的是,當一個內部類沒有使用static修飾的時候,是不能直接使用內部類建立對象,須要先使用外部類對象+ . + new內部類對象,以下代碼所示:對象
class OuterClass{ public class InnerClass{ InnerClass(){ System.out.println("InnerClass Class"); } public void Method(){ System.out.println("InnerClass Method"); } } } public class StaticClassTest02 { public static void main(String[] args) { //須要先生成OuterClass的實例,而後再new一個InnerClass() OuterClass oc = new OuterClass(); oc.new InnerClass(); oc.new InnerClass().Method(); } }
static修飾的方法被稱之爲靜態方法,也叫類方法blog
Attention!加Static修飾的方法與不加Static修飾的方法的區別
☺ 加static的方法,能夠經過類名直接訪問,也能夠經過對象名訪問;加了static的方法,不能再內部寫this,由於直接用類名.方法的時候,沒有當前對象
而不加static只能經過對象名訪問
☺ 加了static的方法,不能在內部訪問非static的屬性和行爲,由於在靜態方法的內部沒法肯定非static的內容屬於那個對象,它是經過類名調用io
class StaticMethod { public static void Method(){ System.out.println("Static Method"); } } public class StaticMethodTest{ public static void main(String[] args) { //1.直接經過類名.方法 StaticMethod.Method(); //2.建立對象,經過對象.方法 StaticMethod sm = new StaticMethod(); sm.Method(); } }
☺ 被static修飾的成員變量屬於類,不屬於某個對象(也就是說:多個對象訪問或修改static修飾的成員變量時,其中一個對象將static成員變量進行了修改,其餘的對象的static成員變量值跟着改變,即多個對象共享同一個static成員變量
☺ 被static修飾的成員,能夠經過類名直接訪問
☺ 在靜態方法中,不能訪問非靜態的內容(變量),不能使用this/super;非靜態中,能夠訪問靜態中的變量
class
public class StaticVar { private static String name = "Static Var"; public static void main(String[] args) { System.out.println(StaticVar.name); } }
靜態代碼塊在非靜態代碼塊以前執行(靜態代碼塊—>非靜態代碼塊—>構造方法)。變量
靜態代碼塊只在第一次new執行一次,以後再也不執行,而非靜態代碼塊在每new一次就執行一次。非靜態代碼塊可在普通方法中定義(不過做用不大);而靜態代碼塊不行。方法
package com.practice.StaticTest; class StaticBlock { //構造方法 public StaticBlock(){ System.out.print("默認構造方法!-->"); } //非靜態代碼塊 { System.out.print("靜態代碼塊!-->"); } //靜態代碼塊 static{ System.out.print("靜態代碼塊!-->"); } public static void Method(){ System.out.println("方法中的代碼塊!"); } } public class StaticBlockTest{ public static void main(String[] args) { //兩次建立對象,static代碼塊只執行一次 StaticBlock sb = new StaticBlock(); sb.Method(); StaticBlock sb1 = new StaticBlock(); sb1.Method(); } }