static方法:
1、定義:
《java編程思想》中提到:static方法就是沒有this的方法,在static方法內部不能調用非靜態方法,反過來是可以的,而且可以在沒有創建任何對象的情況下,僅僅通過類本身來調用static方法,這實際上正是static方法的用途
2:概念:
static方法一般稱作靜態方法,由於靜態方法不依賴於對象就可以訪問,所以也就沒有this,並且static修飾的方法不能調用非靜態成員變量和非靜態成員方法,但是非靜態成員方法可以調用靜態成員方法
static變量:
定義:
static變量也稱為靜態變量,靜態變量和非靜態變量的區別:靜態變量是所有對象共享的,在內存中只存在一個副本,在類的初始化時加載,而非靜態變量是對象特有的,在創建對象的時候被初始化,存在多個副本,各個對象擁有的副本互不影響
static代碼塊:
static關鍵字還有一個比較關鍵的作用就是 用來形成靜態代碼塊以優化程序性能。static塊可以置於類中的任何地方,類中可以有多個static塊。在類初次被加載的時候,會按照static塊的順序來執行每個static塊,並且只會執行一次。
類中的static:
1)子類是不繼承父類的static變量和方法的。因為這是屬於類本身的。
但是子類是可以訪問的。
2)子類和父類中同名的static變量和static方法都是相互獨立的,並不存在任何的重寫的關系。
3)子類和父類中同名的實例變量都是相互獨立的,並不存在任何的重寫的關系。
代碼:
class Parent { public static int i = 1; public int j = 10; public static void staticMethod() { System.out.println("Parent staticMethod run"); } public void method() { System.out.println("Parent method run"); } } class Son extends Parent { public static int i = 2; public int j = 20; public static void staticMethod() { System.out.println("Son staticMethod run"); } public void method() { System.out.println("Son method run,j=" + super.j); } } public class StaticInheritDemo { public static void main(String[] args) { Parent child = new Son(); System.out.println(child.i);// child.staticMethod();// child.method(); System.out.println(child.j); Son s = new Son(); System.out.println(s.i); s.staticMethod(); child.method(); System.out.println(s.j); } }
運行結果:
1 Parent staticMethod run Son method run,j=10 10 2 Son staticMethod run Son method run,j=10 20
類的初始化順序:
類的初始化順序:靜態成員的初始化只執行一次,實例成員每實例化一個對象都初始化一次,一個類中的初始化順序,類內容(靜態變量、靜態初始化塊) => 實例內容(變量、初始化塊、構造方法)
- 兩個具有繼承關系類的初始化順序 * 父類的(靜態變量、靜態初始化塊) => 子類的(靜態變量、靜態初始化塊)=>父類的(實例變量、實例初始化塊、構造方法)=> 子類的(實例變量、實例初始化塊、構造方法)
代碼:
public class StaticInit { public static void main(String[] args) { new A(); System.out.println(); new B(); } } class A { public A() { System.out.println("Constructor A."); } { System.out.println("Instance Block A."); } static { System.out.println("Static Block A."); } } /* 兩個具有繼承關系類的初始化順序 * 父類的(靜態變量、靜態初始化塊) => 子類的(靜態變量、靜態初始化塊)=> * 父類的(實例變量、實例初始化塊、構造方法)=> 子類的(實例變量、實例初始化塊、構造方法) */ class B extends A { public B() { System.out.println("Constructor B."); } { System.out.println("Instance Block B."); } static { System.out.println("Static Block B."); } }
運行結果:
Static Block A. Instance Block A. Constructor A. Static Block B. Instance Block A. Constructor A. Instance Block B. Constructor B.