昨天的一篇文章介紹了訪問控制中的訪問修飾符以及它們的訪問權限。下面這篇文章我們介紹訪問控制中的第二部分static和final關鍵字。
static關鍵字
static修飾成員變量
用static修飾的成員變量不屬於對象的數據結構,static變量是屬於類的變量,通常可以通過類名來引用static成員。Static成員變量和類的信息一起存儲在方法區而不是在堆中,一個類的static成員變量只有「一份」,無論該類創建了多少對象。
Static修飾方法
通常說的方法都會涉及到對具體對象的操作,這些方法在調用時,需要隱式的傳遞對象的引用(this)。
int d=p1.distance(p2);
調用distance方法時,除了傳遞p2參數外,還隱式的傳遞了p1作為參數,在方法中的this關鍵字即表示該參數
static修飾的方法則不需要針對某些對象進行操作,其運行結果僅僅與輸入的參數有關,調用時直接用類名引用。
double c=Math.sqrt(3.0*3.0+4.0*4.0);
該方法在調用時,沒有隱式的傳遞對象引用,因此在static方法中不可以使用this關鍵字。
由於static在調用時沒有具體的對象,因此在static方法中不能對非static成員(對象成員)進行訪問。Static方法的作用在於提供一些「工具方法」和「工廠方法」等。
... ... ...
Point.distance(Point p1,Point p2)
RandomUtils.nextInt()
StringUntils.leftPad(String str,int size,char padChar)
... ... ...
Math.sqrt() Math.sin() Arrays.sort()
static塊
static塊屬於類的代碼塊,在類加載期間執行的代碼塊,只執行一次,可以用來在軟體中加載靜態資源。
final關鍵字
final修飾變量
final關鍵字修飾成員變量,意為不可改變。final修飾成員變量有以下兩種方式初始化:聲明的同時初始化;構造函數中初始化。final關鍵字也可以修飾局部變量,使用之前初始化即可。
public class Emp{
private final int no=100;//final變量聲明時初始化
public void testFinal(){
no=99;
}//編譯錯誤,final的變量不可以改變
}
final修飾方法和類
final關鍵字修飾的方法不可以被重寫,使一個方法不能被重寫的意義在於:防止子類在定義新方法時造成「不經意」重寫
final關鍵字修飾的類不可以被繼承。
final class Foo{ } class Goo extends Foo{ } //編譯錯誤
JDK中有一些基礎類庫被定義為final的,例如:String、Math、Integer、Double等等。是一個類不能被繼承的意義在於:可以保護類不被繼承修改,可以控制濫用繼承對系統造成的危害。
static final常量
static final修飾的成員變量稱為常量,必須聲明的同時初始化,不可被改變。
static final常量會在編譯器被替換。如圖
這樣我們通過兩篇文章把訪問控制的知識點全部說完了。說白了訪問控制就是一個封裝的概念。在這裡面我們介紹了7個英文單詞的使用,分別為package、public、private、default、protected以及今天介紹到的static和final。大家可以結合最近的這兩篇文章把訪問控制的相關知識點梳理一下。
知識無限,能力有限。小編在文章編輯過程中難免出現不盡人意的地方,歡迎大家批評指正,小編也將不斷積累完善自己,讓我們共同進步。