內部類的簡單剖析
內部類的概念:在一個類中再定義一個類,那麼這個類就稱為內部類
在一個類中使用內部類,可以在內部類中直接存取其所在類的私有成員變數;
內部類分為成員內部類、區域性內部類、匿名內部類;下面我們來介紹:
成員內部類:
成員內部類的語法:
public class OuterClass{//外部類
public class InnerClass{//內部類
}}
在內部類中可以隨意的使用外部類的成員方法和成員變數,哪怕它被修飾了private;
內部類的例項一定要繫結在外部類的例項上,如果從外部類中初始化一個內部類物件,那麼內部類物件就會繫結在外部類物件上,內部類的初始化方法與其他類的初始化相同,使用New關鍵字。內部類可以訪問其他外部類成員,但內部類的成員只有在內部類的範圍內是可知的,不能被外部類使用。
public class OuterClass{
/*
修飾符為private的成員變數
*/
privste int i=0;
private void g(){}
//內部類
class InnerClass{
void f(){
//修飾符為private的類成員可以在內部類中隨意使用
g();
i++;
}}}
內部類中的變數與外部類中的變數可以互動使用;
內部內向上轉型為介面:當將一個修飾符為privste的內部類向上轉型為其父類物件,或者直接向上轉型為一個介面,在程式中可以完全隱藏內部類的具體實現過程。向外部提供一個介面,在介面中宣告一個方法,如果實現該介面的內部類中實現該介面的方法,就可以定義多個內部類以不同的方法實現介面中的同一個方法;
使用this關鍵字獲取內部類與外部類的引用:
實現具體程式碼如下:
public class C{
private x;
private class inner{
private x=9;
public void Doit(int x){
x++;//呼叫的是形參x
this.x++;//呼叫的是內部類的x;
C。this.x++;//呼叫的是外部類的x;
}}}
區域性內部類:
內部類不僅可以在類中進行定義,也可以在類中的區域性位置進行定義,如在類的方法或者任意的作用域中,都可以成為是內部類;
區域性內部類實現程式碼如下:
interface Outin{}//定義一個介面
class outin1{
public Outin doit(final String x){//形參為final型別
class innerClass implements Outin{//在doit()方法中定義一個內部類
innerClass(String s){s=x;System.out.print(s);}}
return new Outin("doit");}}
匿名內部類:
實現程式碼:
public class S{
public S(){
new x(){//方法};}}//宣告匿名內部類
靜態內部類:將內部類修飾為static,就i是靜態內部類了;
內部類的繼承:比普通類的繼承要複雜;
實現程式碼如下:
class ClassA{class ClassB}
public class OutputInputClass extends ClassA.ClassB{//繼承內部類B
public OutputInputClass(ClassA a){
a.super();}}
繼承內部類時,必須要給該類的構造方法一個引數,該類的構造方法是要繼承的內部類的外部類的引用,同時用引數呼叫super()方法,才能完成繼承。