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.
