天天看點

Java(十一)類的進階特性(2)

1.2 final變量

  • final關鍵字可用于變量聲明,一旦該變量被設定,就不可以再改變該變量的值。
  • final除了可以修飾基本資料類型的常量,還可以修飾對象引用。由于數組也可以被看作一個對象來引用,是以final可以修飾數組。
  • 被定義為final的常量定義時需要使用大寫字母命名,并且中間使用下劃線進行連接配接,這是Java中的編碼規則。
  • 一個被定義為final的對象引用隻能指向唯一一個對象,不可以将它再指向其他對象,但是一個對象本身的值卻是可以改變的,為了使一個常量真正做到不可更改,可以将常量聲明為static final。
  • 建立随機數
import java.util.Random;
public class FinalStaticData{
          private static Random rand=new Random();//執行個體化一個Random對象
          //随機産生0~10之間的随機數
          private final int a1=rand.nextInt(10);
           

1.3 final方法

final的方法不能被重寫

  • 一個定義為private的方法隐式被指定為final類型
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.printl("子類.doit2()");
    }
    public void doit3(){
         System.out.println("子類.doit3()");
    }
}
public class FInalMethod{
    public static void main(String[] args){
         Sub s=new Sub();  //執行個體化
         s.doit();                  //調用doit()方法
         Parents p=s;         //執行向上轉型操作
         //p.doit();               //不能調用private方法     
         p.doit2();
         p.doit3();
     }
}
           

在Eclipse中運作本執行個體,結果如下:子類.doit() 父類.doit2()

子類.doit3()

從本執行個體可以看出,final方法不能被覆寫,例如,doit2()方法不能在子類中被重寫,但是在父類中定義了一個private final的doit()方法,同時在子類中也定義了一個doit()方法,從表面上來看,子類中的doit()方法覆寫了父類的doit()方法,但是覆寫必須滿足一個對象向上轉型為它的基本類型并調用相同方法這樣一個條件。例如,在主方法中使用"Parents p=s;"語句執行向上轉型操作,對象p隻能調用正常覆寫的doit3()方法,卻不能調用doit()方法,可見子類中的doit()方法并不是正常覆寫,而是生成一個新的方法。