1. 程式人生 > >匿名內部類的初始化

匿名內部類的初始化

Java程式碼  收藏程式碼
  1. package codelib.innerclasses;  
  2. public interface Destination {  
  3.     String readLabel();  
  4. }  
Java程式碼  收藏程式碼
  1. package codelib.innerclasses;  
  2. /** 
  3.  * @author Administrator 
  4.  * 
  5.  */  
  6. public class InnerClassInitTest {  
  7.     public Destination destination(  final String dest, final float price){  
  8.         return
     new Destination() {  
  9.             private int cost;  
  10.             private String label = dest;  
  11.             {//例項初始化程式碼塊,相當於構造器的實際效果  
  12.                 cost = Math.round(price);  
  13.                 if (cost > 100)  
  14.                     System.out.println("Over budget!");  
  15.             }  
  16.             public
     String readLabel() {  
  17.                 return label;  
  18.             }  
  19.         };  
  20.     }  
  21.     /** 
  22.      * @param args 
  23.      */  
  24.     public static void main(String[] args) {  
  25.         InnerClassInitTest p = new InnerClassInitTest();  
  26.         Destination d = p.destination ("Tasmania",101.34F);  
  27.     }  
  28. }  

    如果匿名內部類希望使用一個在其外部定義的物件(呼叫父類構造器時,傳入的引數除外),那麼編譯器要求其引數引用是final的. 

構造器是與類名同名的函式,而匿名類因為沒有名字,所以也就沒有構造器,為了達到與構造器例項化物件的效果,可以使用程式碼塊來進行例項初始化操作.如上例中的花括號中的程式碼.

    匿名內部類與正規的繼承相比有些受限,因為匿名內部類既可以擴充套件類,也可以實現介面,但是不能兩者兼備.而且如果是實現介面,也只能實現一個介面.