標籤:sys 轉型 告訴 父類 extends 不同 extend 公眾 用法
在java的關鍵字中,static和final是兩個我們必須掌握的關鍵字。不同於其他關鍵字,他們都有多種用法,而且在一定環境下使用,可以提高程式的運行效能,最佳化程式的結構。
1.fianl變數
fianl關鍵字可以用於聲明變數,一旦該變數被設定,就不能更改該變數的值,並且定義的變數必須在聲明時對其進行賦值操作。一旦一個對象引用被修飾為final後,它只能恒定指向一個對象,無法將其改變指向另一個對象。為了深入瞭解final關鍵字,我們看以下執行個體。
class Value {
int v;
public Value(int v) {
this.v = v;
}
}
public class FinalTest {
final int f1 = 1;
final int f2;
public FinalTest() {
f2 = 2;
}
public static void main(String[] args) {
final int value1 = 1;
// value1 = 4;
final double value2;
value2 = 2.0;
final Value value3 = new Value(1);
value3.v = 4;
}
}
上面的例子中,我們先來看一下main方法中的幾個final修飾的資料,在給value1賦初始值之後,我們無法再對value1的值進行修改,final關鍵字起到了常量的作用。從value2我們可以看到,final修飾的變數可以不在聲明時賦值,即可以先聲明,後賦值。value3時一個引用變數,這裡我們可以看到final修飾引用變數時,只是限定了引用變數的引用不可改變,即不能將value3再次引用另一個Value對象,但是引用的對象的值是可以改變的。
2.final方法
用final關鍵字修飾方法,它表示該方法不能被覆蓋。這種使用方式主要是從設計的角度考慮,即明確告訴其他可能會繼承該類的程式員,不希望他們去覆蓋這個方法。這種方式我們很容易理解,然而,關於private和final關鍵字還有一點聯絡,這就是類中所有的private方法都隱式地指定為是final的,由於無法在類外使用private方法,所以也就無法覆蓋它。看以下執行個體。
class Parents{
private final void doit(){
System.out.println("父類.doit()");
}
final void doit2(){
System.out.println("父類.doit2()");
}
public void doit3(){
System.out.println("父類.doit3()");
}
}
class Sub extends Parents{
public final void doit(){ //在子類中定義一個doit()方法
System.out.println("子類.doit()");
}
/* final void doit2(){
System.out.println("子類.doit2()"); //Sub中的doit2()無法覆蓋Parents中的doit2()
} */
public void doit3(){
System.out.println("子類.doit3()");
}
}
public class FinalMethod{
public static void main(String[] args){
Sub t=new Sub(); //執行個體化一個子類對象
t.doit(); //調用子類對象的doit()方法
Parents p=t; //子類對象向上轉型為父類對象
//p.doit(); doit()方法定義為private,子類不能訪問
p.doit2(); //調用父類對象的doit2()方法
p.doit3(); //覆蓋,覆蓋必須滿足一個對象向上轉型為它的基本類型並調用相同方法
}
}
從本執行個體可以看出,final方法不能被覆蓋,覆蓋必須滿足一個對象向上轉型為它的基本類型並調用相同方法這樣一個條件,例如在子方法中,Parents p=t; 子類對象向上轉型為父類對象,對象p只能調用正常覆蓋的doit3()方法,卻不能調用doit()方法。
3.final類
瞭解了final關鍵字的其他用法,我們很容易可以想到使用final關鍵字修飾類的作用,那就是用final修飾的類是無法被繼承的。如果將一個類設定為final類型,則類中的所有方法都被隱式設定為final形式,final類中的成員變數可以被設定為final或非final類型。看以下執行個體。
final class FinalClass{
int a=3;
public static void main(String[] args){
FinalClass t=new FinalClass();
t.a++;
System.out.println(t.a); //輸出a=4
}
}
搜尋公眾號“程式員考拉”,歡迎關注!
Java final關鍵字