匿名內部類 是否可以繼承其它類,是否可以實現介面
阿新 • • 發佈:2018-12-26
匿名內部類是沒有名字的內部類,不能繼承其它類,但一個內部類可以作為一個介面,由另一個內部類實現.
一、由於匿名內部類沒有名字,所以它沒有建構函式。因為沒有建構函式,所以它必須完全借用父類的建構函式來例項化,換言之:匿名內部類完全把建立物件的任務交給了父類去完成。
二、在匿名內部類裡建立新的方法沒有太大意義,但它可以通過覆蓋父類的方法達到神奇效果,如上例所示。這是多型性的體現。
三、因為匿名內部類沒有名字,所以無法進行向下的強制型別轉換,持有對一個匿名內部類物件引用的變數型別一定是它的直接或間接父類型別。
new <類或介面> <類的主體>
匿名類
匿名類是不能有名稱的類,所以沒辦法引用它們。必須在建立時,作為new語句的一部分來宣告它們。
這就要採用另一種形式的new語句,如下所示:
new <類或介面> <類的主體>
這種形式的new語句宣告一個新的匿名類,它對一個給定的類進行擴充套件,或者實現一個給定的介面。它還建立那個類的一個新例項,並把它作為語句的結果而返回。要擴充套件的類和要實現的介面是new語句的運算元,後跟匿名類的主體。
如果匿名類對另一個類進行擴充套件,它的主體可以訪問類的成員、覆蓋它的方法等等,這和其他任何標準的類都是一樣的。如果匿名類實現了一個介面,它的主體必須實現介面的方法。
注意匿名類的宣告是在編譯時進行的,例項化在執行時進行。 這意味著for迴圈中的一個new語句會建立相同匿名類的幾個例項,而不是建立幾個不同匿名類的一個例項。
從技術上說,匿名類可被視為非靜態的內部類,所以它們具有和方法內部宣告的非靜態內部類一樣的許可權和限制。
如果要執行的任務需要一個物件,但卻不值得建立全新的物件(原因可能是所需的類過於簡單,或者是由於它只在一個方法內部使用),匿名類就顯得非常有用。匿名類尤其適合在Swing應用程式中快速建立事件處理程式。
exp:
return new Contents() {
private int i = 11;
public int value() { return i; }
};
這種奇怪的語法要表達的意思是:“ 建立從Contents衍生出來的匿名類的一個物件”。由new表示式返回的控制代碼會自動上溯造型成一個Contents控制代碼。匿名內部類的語法其實要表達的是:
class MyContents extends Contents {
private int i = 11;
public int value() { return i; }
}
return new MyContents();
若試圖定義內部類,並想使用在匿名內部類外部定義的一個物件,則編譯器要求外部物件必須是final屬性.
public class Parcel9 {
public Destination
dest(final String dest, final float price) {
return new Destination() {
private int cost;
// Instance initialization for each object:
{
cost = Math.round(price);
if(cost > 100)
System.out.println("Over budget!");
}
private String label = dest;
public String readLabel() { return label; }
};
}
public static void main(String[] args) {
Parcel9 p = new Parcel9();
Destination d = p.dest("Tanzania", 101.395F);
}
}
一、由於匿名內部類沒有名字,所以它沒有建構函式。因為沒有建構函式,所以它必須完全借用父類的建構函式來例項化,換言之:匿名內部類完全把建立物件的任務交給了父類去完成。
二、在匿名內部類裡建立新的方法沒有太大意義,但它可以通過覆蓋父類的方法達到神奇效果,如上例所示。這是多型性的體現。
三、因為匿名內部類沒有名字,所以無法進行向下的強制型別轉換,持有對一個匿名內部類物件引用的變數型別一定是它的直接或間接父類型別。
new <類或介面> <類的主體>
匿名類
匿名類是不能有名稱的類,所以沒辦法引用它們。必須在建立時,作為new語句的一部分來宣告它們。
這就要採用另一種形式的new語句,如下所示:
new <類或介面> <類的主體>
這種形式的new語句宣告一個新的匿名類,它對一個給定的類進行擴充套件,或者實現一個給定的介面。它還建立那個類的一個新例項,並把它作為語句的結果而返回。要擴充套件的類和要實現的介面是new語句的運算元,後跟匿名類的主體。
如果匿名類對另一個類進行擴充套件,它的主體可以訪問類的成員、覆蓋它的方法等等,這和其他任何標準的類都是一樣的。如果匿名類實現了一個介面,它的主體必須實現介面的方法。
注意匿名類的宣告是在編譯時進行的,例項化在執行時進行。
從技術上說,匿名類可被視為非靜態的內部類,所以它們具有和方法內部宣告的非靜態內部類一樣的許可權和限制。
如果要執行的任務需要一個物件,但卻不值得建立全新的物件(原因可能是所需的類過於簡單,或者是由於它只在一個方法內部使用),匿名類就顯得非常有用。匿名類尤其適合在Swing應用程式中快速建立事件處理程式。
exp:
return new Contents() {
private int i = 11;
public int value() { return i; }
};
這種奇怪的語法要表達的意思是:“
class MyContents extends Contents {
private int i = 11;
public int value() { return i; }
}
return new MyContents();
若試圖定義內部類,並想使用在匿名內部類外部定義的一個物件,則編譯器要求外部物件必須是final屬性.
public class Parcel9 {
public Destination
dest(final String dest, final float price) {
return new Destination() {
private int cost;
// Instance initialization for each object:
{
cost = Math.round(price);
if(cost > 100)
System.out.println("Over budget!");
}
private String label = dest;
public String readLabel() { return label; }
};
}
public static void main(String[] args) {
Parcel9 p = new Parcel9();
Destination d = p.dest("Tanzania", 101.395F);
}
}