成員內部類的子類可以是內部類,也可以不是內部類;
當成員內部類的子類不是內部類或子類雖是內部類但與其父類不在同乙個外部類時,子類的構造方法第一句要顯式新增如下的語句:
外部類物件引用.super(引數);
這裡的外部類指父類所在的外部類編譯器預設給成員內部類的構造方法傳入乙個引數,該引數是內部類所依附的外部類物件的引用;
注:本文涉及到的類都是非靜態類
先看個例子
class
manpublic
void
getwoman()
}//區域性內部類的物件需在內部類編譯後再建立
//區域性內部類對於外界是隱藏的,因此需要在內部類裡面完成物件的定義和引用
newwoman()
.showinner()
;}public
static
void
main
(string[
] args)
}
子類woman存在於父類man的方法getwoman()中,此時在方法中定義的屬性變數 jdk8預設在其前面加上了final標識,在子類中不可更改。
class
withinner
class
inheritinner
extends
inner
}public
static
void
main
(string[
] args)
}
執行結果如下
*****
此時子類inheritinner和父類inner位於同乙個外部類withinner下
withinner wi =
newwithinner()
;inheritinner obj = wi.
newinheritinner()
;
使用父類的外部類物件引用.new 子類構造方法()
格式呼叫構造方法
class
withinner
}class
person
}public
static
void
main
(string[
] args)
}
使用子類的外部類物件引用.new 子類構造方法(父類外部類物件引用)
格式呼叫子類構造方法
子類inheritinner中顯式新增了wi.super();在構造方法中傳入了父類物件的引用
inheritinner
(withinner wi)
這是因為,子類與父類處於不同的外部類,編譯時,子類的構造方法預設傳入的是子類的外部類person類的物件引用,而不是父類inner類的物件引用;
如果要呼叫父類的構造方法的話,必須要給它傳入乙個其外部類withinner的物件引用;
所以這時,子類的構造方法顯式傳入乙個withinner類物件引用wi,並通過wi.super();的方式把wi傳給父類的構造方法並呼叫之。
class
withinner
}class
inheritinner
extends
withinner.inner
public
static
void
main
(string[
] args)
}
父類inner位於外部類withinner下,子類inheritinner沒有外部類
withinner wi =
newwithinner()
;inheritinner obj =
newinheritinner
(wi)
;
宣告子類物件引用時直接呼叫子類構造方法即可,注意引數為父類的外部類物件引用
總結:
java 繼承 內部類
需要如下定義 public class outer public class extendsinner extends outer.inner 當建立乙個子類時,子類構造器總會呼叫父類的構造器,因此在建立非靜態內部類的子類時,必須 保證讓子類構造器可以呼叫非靜態內部類的構造器,呼叫非靜態內部類的構造...
內部類的繼承
因為內部類的構造器必須連線到指向其外圍類物件的引用,所以在繼承內部類的時候,情況會變得有些複雜。問題在於,那個指向外圍類物件的 秘密的 引用必須被初始化,而在匯出類中不在存在可連線的預設物件。要解決這個問題,必須使用特殊的語法來說清它們之間的關聯。1 外部類 2class outer 7class ...
內部類的繼承
一 同一外包類中的內部類之間的繼承 如 a.innerclass child 繼承 a.innerclass parent eg class outer class inner 2 extends inner 1 public void demo 二 不同外包類的內部類之間的繼承 如 b.inner...