天天看點

面向對象加強--靜态和非靜态

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();//非靜态方法可以通路靜态方法
	}