定義在其它類內部的類叫內部類,在方法中可以定義內部類,在接口中也可以定義內部類(此時麼默認被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);//創建了外部類的實例和內部類的實例
}
}
顯示結果爲:
靜態內部類中的靜態成員
靜態內部類的非靜態成員
非靜態內部類
值得注意的是,內部類是不能被重寫的,因爲在使用內部類時要加上外部類的前綴,而子類的類名和父類的是不相同的,就不能完全同名,也就不能重寫。