內部類

定義在其它類內部的類叫內部類,在方法中可以定義內部類,在接口中也可以定義內部類(此時麼默認被public static修飾)。因爲內部類算是外部類的成員之一(局部內部類和匿名內部類除外),所以內部類比外部類多三個修飾符:private,protected,static;定義內部類的語法格式爲:public Class inclass{}

在非靜態內部類中可以字節訪問外部類的private成員,但在外部類中則不能直接訪問非靜態內部類中的成員,要在外部類中訪問內部類的成員,必須先在外部類中創建內部類的對象,並通過這個對象來訪問內部類的成員;用static修飾的內部類稱爲靜態內部類(也叫類內部類),跟其他靜態成員一樣,靜態內部類屬於外部類本身,不屬於任何其他對象,且不能引用非靜態成員。

public class InteriorClass
{
	private static int number = 12;
	private class in
	{
            private int num = number;//內部類直接訪問外部類的成員
            //private static int num1 = 12;程序錯誤,因爲在非靜態內部類中定義靜態成員
	}
        
        private static class instatic
        {
            private static int num1= number;
            private int num2 = number;//靜態內部類中也可以定義非靜態內部成員
        }
        
        private int num1 = new InteriorClass.in().num;//通過創建內部類的實例來使用內部類的成員
        private static int num2 = InteriorClass.instatic.num1;//通過外部類的類名直接引用內部類的成員
        
	public static void main(String[] args)
	{
            System.out.println(new InteriorClass().num1);//輸出12
            System.out.println(num2);//輸出12
	}
}
由上面代碼可以看出一個外部類中可能有不止一個內部類。

當內部類的訪問控制符不是private時,內部類能被其他類使用。若無修飾符,則內部類能被外部類所在包的其他類訪問;若修飾符是protected,則內部類除了能被外部類所在包的其他類訪問,還能被外部類的子類訪問;若修飾符是public,則內部類能在任何地方被訪問。

當非靜態內部類中的成員要被外部類以外的類訪問時,要先創建外部類的實例,在通過外部類的實例創建內部類的實例,當靜態內部類中的成員要被訪問時,不用創建外部類的實例,有時甚至不用創建內部類的實例,eg:

class OutClass {
    static class insattic
    {  
        public String s = "靜態內部類的非靜態成員";
        public static String ss = "靜態內部類中的靜態成員";
    }
    
    public class in
    {
        public String s = "非靜態內部類";
    }
}

public class OutOutClass
{
    public static void main(String[] args)
    {
        System.out.println(OutClass.insattic.ss);//沒有創建實例,因爲變量ss是外部類OutClass的類內部類instatic中的類方法
        System.out.println(new OutClass.insattic().s);//創建了一個內部類實例
        System.out.println(new OutClass().new in().s);//創建了外部類的實例和內部類的實例
    }
}
顯示結果爲:

靜態內部類中的靜態成員
靜態內部類的非靜態成員
非靜態內部類

值得注意的是,內部類是不能被重寫的,因爲在使用內部類時要加上外部類的前綴,而子類的類名和父類的是不相同的,就不能完全同名,也就不能重寫。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章