09.02 關於Java中static和final關鍵字的用法總結

1 static

static通常翻譯為“靜態”,可用來修飾類、成員變量和方法,也可以聲明一個靜態塊。下面分別介紹這幾類用法。

1.1 static類

首先需要注意的是,普通類是不能用static來修飾的,static只能用來修飾內部類。使用static修飾內部類之後可以使用“類.內部類”實例化這個內部類的對象。如下面的例子:


public class Outer {
\tpublic static class Inner {
\t\tpublic Inner() {
\t\t\tSystem.out.println("this is a inner class.");
\t\t}
\t}
}

上面在Outer類中定義了一個靜態Inner類,在Test中則直接使用了new Outer.Inner();來實例化這個內部類。


public class Test {
\tpublic static void main(String[] args) {
\t\tnew Outer.Inner();
\t}
}

而對於其他非靜態內部類,則只能先實例化外部類,然後才能調用內部類。

在使用static內部類時,還需要注意對於內部類,只有static聲明的內部類中才能使用static聲明成員變量和方法。這也是static內部類存在的必要性。

下面我介紹一下我在項目中使用過的static修飾內部類的場景。

我在一個項目中使用static修飾內部類最常用的是在定義一些各個模塊中通用的信息時用到了static來修飾類。這些類中大多都是定義一些通用的變量和方法,並且多會與final結合起來使用。

1.2 static變量

按照是否靜態的對類成員變量進行分類可分兩種:一種是被static修飾的變量,叫靜態變量或類變量;另一種是沒有被static修飾的變量,叫實例變量。靜態變量與實例變量的區別主要是:靜態變量被所有的對象所共享,在內存中只有一個副本,它當且僅當在類初次加載時會被初始化。而實例變量是對象所擁有的,在創建對象的時候被初始化,存在多個副本,各個對象擁有的副本互不影響。

1.3 static方法

static方法也叫靜態方法,也可以直接使用“類.方法()”來直接調用。但是需要注意一下幾點:一是靜態方法中不能使用this和super關鍵字;二是靜態方法中不能使用非靜態成員變量,也不能調用非靜態方法;三是靜態方法與靜態變量一樣都是獨立於任何實例,所以靜態方法不能使用abstract修飾,即static方法不能為抽象方法。

1.4 static塊

對於靜態塊的使用,在我初學Java時,我是拒絕使用的,總覺得這樣用不好。但是,當我在實習做項目時,通過各種調試工具分析代碼時,突然發現了靜態塊的妙用。

首先,靜態塊顧名思義就是使用static{}的一段代碼塊。靜態塊是在JVM加載類的時候執行的,並且只會執行一次。由於這個特性,所以在一些場景非常好用。我在項目中遇到的過的使用場景主要有在實例化一個日誌對象時,使用static塊;然後就是實例化一些在類中常用但不需要多次實例化的變量等。

2 final

final有不可改變之意,可用來修飾非抽象類、非抽象成員變量和方法。下面分別總結一下其用法。

1.1 final類

final類不能被繼承,所以其中的成員變量和方法默認也是為final的。一般來說,只有在確信該類不需要再有子類,並且不會被擴展。所以一般只有在定義一個保存一些常量信息的時候才會將類聲明為final類。

1.2 final變量

final修飾的變量將無法再被改變,即為常量。final變量在定義時可以不賦值,此時意味著該變量為null;在使用這個變量之前則必須為其賦值,否則會出錯,賦值之後這個值將不會再被改變。

1.3 final方法

final修飾的方法不能不被覆蓋,所以聲明為final的方法之後,該類的子類不能覆寫此方法,但是可以被繼承。

3 static和final結合使用

可以同時使用static和final修飾成員變量和方法,此時的成員變量和方法可以直接用“類.名稱”調用,成員變量的值不能改變,方法不能被覆寫。

關於Java中static和final關鍵字的用法總結


分享到:


相關文章: