1.靜态成員
每個類有一個static池,池中統一存放該類的static變量,為所有對象共享。static變量在類裝載時就被初始化。
為什麼在靜态方法中不能通路非靜态成員(變量或方法)?
因為當執行一個類的時候,會先執行她的靜态成員,這個時候,非靜态成員還沒進記憶體(還沒産生)
static的基本規則:
(1)一個類的靜态方法隻能通路靜态屬性。
(2)一個類的靜态方法不能夠直接調用非靜态方法。
(3)如通路控制權限允許,static屬性和方法可以使用類名加‘.’方式調用;當然也可以使用執行個體加‘.’方式調用。
(4)靜态方法中不存在目前對象,因而不能使用“this”,當然也不能使用“super”。
(5)構造方法不允許聲明為static的。
(6)靜态方法不能被非靜态方法覆寫,反之也不行。
2.靜态初始器——靜态塊
靜态初始器(Static Initializer): 是一個存在于類中方法外面的靜态塊。靜态初始器僅僅在類裝載的時候(第一次使用類的時候)執行一次。
功能:通常用來初始化靜态的類屬性。
通常在進行資料庫連接配接的時候就需要使用到靜态塊,先進行連接配接,并且隻需要連接配接一次
public int a1 = 3;
static {// 靜态塊
System.out.println("static==123");
}
{// 執行個體塊
System.out.println("123");
}
public static void main(String args[]) {
}
上面這段代碼輸出:static==123
3.靜态導入(import)
(1)當我們要擷取一個随機數時,寫法是:
double randomNum = Math.random();
(2)可以使用靜态import寫為:
import static java.lang.Math.random;
double randomNum = random();
(3)靜态引用使我們可以象調用本地方法一樣調用一個引入的方法,當我們需要引入同一個類的多個方法時,隻需寫為“import static java.lang.Math.*”即可。這樣的引用方式對于枚舉也同樣有效。
(4)靜态導入不建議過多使用,因為這容易跟自定義方法混淆(不易辨認)
4.靜态與非靜态方法的覆寫
靜态方法不能被非靜态方法覆寫,反之也不行。
覆寫方法:前(權限)不能小,後(非運作時異常)不能大
public class A {
public void a1(){
System.out.println("a.........");
}
public static void b(){
System.out.println("b.........");
}
}
class B extends A{//靜态覆寫靜态,非靜态覆寫非靜态
/*
public static void a1(){
System.out.println("a2...........");
}
public void b(){
System.out.println("b2.........");
}
*/
}
5.靜态方法與非靜态方法的通路
靜态方法不存在this.和super()
靜态不可通路非靜态,(類模闆不能通路由他生成的類對象)
但是非靜态可以通路靜态(同理)
private int n=10;
public void a(){
System.out.println("aaaaaaaa");
}
public static void t1(){
//System.out.println(n);//WA:靜态方法中不能通路非靜态成員
//a();//WA:同上
//System.out.println(this); //WA: 靜态方法中不存在:this,super
}
public void b(){
a(); //省略了: this.
t1();//非靜态方法可以通路靜态方法
}