Java——static關鍵字


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.

  


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM