Java—內部類(三)—內部類的繼承
內部類的繼承
內部類和其他普通類一樣,同樣可以被繼承,這樣給本來就十分靈活的內部類增加了更好的結構性和程式碼複用性。只是內部類的繼承和普通類有一些不同之處,是在使用時需要多加註意的。因為內部類在建立時需要外部類的引用,所以在內部類的繼承上也需要外部類的協助。接下來看示例程式碼。
class WithInner{
class Inner{
}
}
public class test3 extends WithInner.Inner{
test3(WithInner wi){
wi.super();
}
public static void main(String[] args){
WithInner wi = new WithInner();
test3 t3 = new test3(wi);
}
}
首先在繼承語句extends處,注意名稱空間,需要加上外圍類名,才能對應上正確的內部類。其次是構造物件上,這裡需要自己寫一個接受外圍類引用的構造器,來給匯出類提供建立物件的基本環境。注意在構造器中的這一句wi.super()這是必須在構造器中使用的,才能夠成功的構造出一個繼承自內部類的物件。及enclosingClassReference.super()這個語法一定要牢記。
這是簡單的預設構造器的繼承,下面的示例難一點,題目是:建立一個包含內部類的類,此內部類有一個非預設構造器(需要引數的構造器)。建立另一個也包含內部類的類繼承自第一個內部類。可以先自己試著寫一下,看看哪裡寫的時候有問題,然後對照下面的示例有助於理解,與記憶。
class outer{
class inner{
public inner(String s){
System.out.println(s);
}
}
}
public class test{
class testInner extends outer.inner{
testInner(outer o){
o.super("Hello");
}
}
public static void main(String[] args){
outer o = new outer();
test t = new test();
testInner ti = t.new testInner(o);//建立內部類時需要外部類物件引用,才能成功建立
}
}
和上面一例沒有太大的區別,就是構造器帶上了引數,其次是在內部類物件的建立上,需要先有一個外圍物件然後用className.new 的語法進行建立,如果不清楚的可以看前面幾篇關於內部類的建立的文章,有寫。
以上就是內部類的繼承了。既然說到了繼承,很自然的就會聯想到,內部類會被覆蓋嗎?
到一個外部類繼承自另一個含有內部類的父類。然後在該類中重寫了父類的內部類,這個時候會怎麼樣呢?父類的內部類會被覆蓋嗎?看下面程式碼,告訴你答案:
class Egg{
private Yolk y;
protected class Yolk{
public Yolk(){
System.out.println("Egg.Yolk()");
}
}
public Egg(){
System.out.println("New Egg");
y = new Yolk();
}
}
public class BigEgg extends Egg{
public class Yolk{
public Yolk(){
System.out.println("BigEgg.Yolk");
}
}
public static void main(String[] args){
new BigEgg();
}
}
輸出如下:
New Egg
Egg.Yolk()
由輸出可以看出,重寫的內部類並沒有被呼叫,說明了在不同的外圍類中的內部類是相互獨立的實體,他們存在於自己的名稱空間中,如果想要實現覆蓋的話,可以直接使用繼承語法,將子類的內部類繼承自父類的內部類,即可,這裡就補貼出程式碼了,大家自己去試試。