static和final
【static關鍵字】
1、static修飾成員變數
用static修飾的成員變數不屬於對象的數據結構;static變數是屬於類的變數,通常可以通過類名來引用static成員;static成員變數和類的信息一起存儲在方法區,而不是在堆中,一個類的static成員變數只有「一份」,無論該類創建了多少對象。
2、static修飾方法
通常的方法都會涉及到對具體對象的操作,這些方法在調用時,需要隱式的傳遞對象的引用(this)。看下列代碼:
class Moo{
int a;
static void test(){
System.out.println(a);//編譯錯誤,應改為this.a
}
}
static修飾的方法則不需要針對某些對象進行操作,其運行結果僅僅與輸入的參數有關,調用時直接用類名引用。看下列代碼:
double c = Math.sqrt(3.0*3.0+4.0*4.0);
以上代碼輸出的結果僅僅與輸入的參數有關,調用時直接用類名Math引出。
由於static在調用時沒有具體的對象,因此在static方法中不能對非static成員(對象成員)進行訪問。static方法的作用在於提供一些「工具方法」和「工廠方法」等。
3、static塊
屬於類的代碼塊,在類載入期間執行的代碼塊,只執行一次,可以用來在軟體中載入靜態資源。看下列代碼:
class Foo{
static{
}
public Foo(){
}
}
Foo foo=new Foo();
輸出的結果為:
Load Foo.class
Foo();
Foo類載入時,運行靜態塊,在創建對象之前。
【final關鍵字】
1、final修飾變數
final關鍵字修飾成員變數,意為不可改變。
final修飾成員變數,兩種方式初始化:1)聲明同時初始化;2)構造函數中初始化。
final關鍵字也可以修飾局部變數,使用之前初始化即可。
看下列代碼:
public class Emp{
private final int no=100;//final變數聲明時初始化
public void testFinal(){
no=99;//編譯錯誤,final的變數不可被改變
}
}
2、final修飾方法
final關鍵字修飾的方法不可以被重寫。
使一個方法不能被重寫的意義在於:防止子類在定義新方法時造成的「不經意」重寫。
3、final修飾類
final關鍵字修飾的類不可以被繼承。看下列代碼:
final class Foo{}
class Goo extends Foo{}//會有編譯錯誤
JDK中的一些基礎類庫被定義為final的,例如:String、Math、Integer、Double等等。
使一個類不能被繼承的意義在於:可以保護類不被繼承修改,可以控制濫用繼承對系統造成的傷害。
4、static final常量
static final修飾的成員變數稱為常量,必須聲明同時初始化,不可被改變。
static final常量會在編譯期被替換,例如:
class Foo{
public static final int NUM=100;
}
class Goo{
public static void main(String[] args){
System.out.println(Foo.NUM);//代碼編譯時,會替換為其常量值(100),在運行Goo類時,Foo類不需要被載入。
}
}
TAG:鄰家零 |