java 靜態類的簡單介紹

1、Java靜態類:靜態方法、靜態變量、靜態代碼塊、靜態內部類

 

靜態類,即定義了靜態方法、靜態變量、靜態代碼塊的類,或靜態內部類,這些靜態方法、靜態變量不需要實例化即可直接引用,而靜態代碼塊則是用在系統初始化時。

 

靜態類與非靜態類的區別

 

先看代碼:

 

public class HelloWorld{

Public static void main(String[] args){

System.out.println(“Hello,world!”);

}

}

 

這段簡單的代碼定義了一個靜態的方法名爲main,這個就意味着告訴Java編譯器,這個 方法不需要創建一個此類的對象即可使用。 它只輸出簡單的”Hello , world”,然而,它卻展示了static關鍵字的主要用法.

 

靜態類,即定義了靜態方法、靜態變量、靜態代碼塊的類,或靜態內部類。靜態類和非靜態類的區別如下:

 

靜態類不能被實例化,類的成員主要是靜態成員和靜態方法

非靜態類一般需要實例化後纔可以操作,不過接口和抽象類不能直接實例化。

靜態的類都是在運行時靜態地加載到內存中(一開始運行首先從靜態的類開始),所以 也不需要對它們進行初始化,也沒有實例,因此在類的內部也不能用this

如果是靜態內部類的話,靜態內部類不能操作訪問外部數據,靜態內部類的實例生成不需要從外部生成相關類。

 

靜態方法:

通常,在一個類中定義一個方法爲static,那就是說,無須本類的對象即可調用此方法。調用一個靜態方法就是“類名.方法名”,靜態方法的使用很簡單。

例如:

public class StaticClass {

//定義一個靜態方法

public static void inc(String str){

System.out.println(str);

}

public static void main(String[] args) {

StaticClass.inc("這就一個靜態類!"); //引用靜態類

}

}

 

一般來說,靜態方法常常爲應用程序中的其它類提供一些實用工具所用,在Java的類庫中大量的靜態方法正是出於此目的而定義的。

 

靜態變量:

靜態變量與靜態方法類似。所有此類實共享此靜態變量,也就是說在類裝載時,只分配一塊存儲空間,所有此類的對象都可以操控引塊存儲空間。

例如:

 

public class StaticClass {

//定義靜態變量

public static int i = 0 ;

//定義靜態方法

public static void inc(){

i++;

}

 

//測試靜態類,修改靜態變量

public class StaticTest {

public static void main(String[] args) {

StaticClass v1,v2;

v1 = new StaticClass();

v2 = new StaticClass();

System.out.println("v1.i="+v1.i+"  v2.i="+v2.i);

v1.inc();

System.out.println("v1.i="+v1.i+"  v2.i="+v2.i);

}

}

運行結果:

v1.i=0  v2.i=0

v1.i=1  v2.i=1

 

由此可見,在調用了v1.inc()方法後,修改了靜態變量i的值,同時v2變量的i值也發生了變化。這個說明每位共享一塊存儲區。

 

靜態代碼塊:

Static變量有點類似於C中的全局變量的概念,值得探討的是靜態變量的初始化問題。修改上面的程序:

例如

public class StaticClass {

// 定義靜態變量

public static int i = 0;

 

public StaticClass() {

i = 15;

}

 

public StaticClass(int n) {

i = n;

}

 

// 定義靜態方法

public static void inc() {

i++;

}

}

 

 

//測試靜態類,修改靜態變量

public class StaticTest {

 

// 初始化靜態構造函數

StaticClass v = new StaticClass(10);

// 訪問靜態類

static StaticClass v1, v2;

// 靜態代碼塊

static {

System.out.println("初始化:v1.c=" + v1.i + " v2.i=" + v2.i);

v1 = new StaticClass(27);

System.out.println("初始化:v1.c=" + v1.i + " v2.i=" + v2.i);

v1 = new StaticClass(15);

System.out.println("初始化:v1.c=" + v1.i + " v2.i=" + v2.i);

 

}

 

public static void main(String[] args) {

StaticTest test = new StaticTest();

System.out.println("test.i=" + test.v.i);

System.out.println("v1.i=" + v1.i + "  v2.i=" + v2.i);

v1.inc();

System.out.println("v1.i=" + v1.i + "  v2.i=" + v2.i);

System.out.println("test.i=" + test.v.i);

}

}

從輸出的結果可以看出,靜態代碼塊在系統啓動時就執行了輸出。在static{後面跟着一段代碼,這是用來顯式地初始化靜態變量,這段代碼只會初始化一次,且在類被第一次裝載時}

另外,static定義的變量會優先於任何其它非static變量,不論其出現的順序如何。例子中v是在v1v2的前面,但結果卻是v1v2的初始化在v前面。在涉及到繼承的時候,會先初始化父類的static變量,然後是子類。

 

 

靜態內部類:

Static在類的內部定義靜態變量、靜態方法和靜態代碼塊的使用情形,除此之外,它還可以修飾class的定義。

通常一個普通類不允許聲明爲靜態的,只有一個內部類可以。這時這個聲明爲靜態的內部類可以直接作爲一個普通類來使用,而不需要實例化一個外部類。

例如:

public class Tests {

//定義一個靜態內部類

public static class InnerClass{

//靜態內部類構造函數

InnerClass(){

System.out.println("InnerClass");

}

//靜態內部定義的方法

public void print(String string){

System.out.println(string);

}

 

}

public static void main(String[] args) {

Tests.InnerClass ci = new Tests.InnerClass();//應用靜態內部類

ci.print("this is String");

 

}

}

 

輸出結果:

InnerClass

this is String

 

靜態內部類和普通類的用法是一樣的

發佈了37 篇原創文章 · 獲贊 15 · 訪問量 4萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章