內部類:
在非靜態內部類實例裏面,保存着一個它寄存的外部類實例的引用(當使用一個非靜態內部類的實例時,該實例必須有一個外部類的實例引用。也即是說,非靜態內部類實例必須寄存在外部類實例裏面)。
內部類(靜態或非靜態)本質上是類的成員變量。
局部內部類(方法內類)是方法的局部變量。就如方法內變量 int i;一樣,不能使用任何訪問修飾符或static。
如果匿名內部類使用了外部類的成員,則該成員必須是final修飾的。
如果局部內部類使用了方法或方法參數的變量,則該變量必須是final修飾的。
非靜態內部類不能有靜態聲明,無論是靜態初始快,還是靜態屬性、方法。
class OutterClass
{
private int count;
//內部類
private class InnerClass
{
/*static 非靜態內部類不能有靜態聲明,無論是靜態初始快,還是靜態屬性、方法
{
System.out.println("內部類靜態初始化塊執行!");
}*/
{
System.out.println("內部類普通初始化塊執行!");
}
public InnerClass()
{
System.out.println("內部類構造方法執行!");
}
}
}
關於內部類訪問級別的代碼測試:
package lesson8;
//外部類
class OutterClass
{
private int count=1008;
private static int eyecount;
//內部類
private class InnerClass
{
/*static 非靜態內部類不能有靜態聲明,無論是靜態初始快,還是靜態屬性、方法
{
System.out.println("內部類靜態初始化塊執行!");
}*/
//Error:原因 非靜態內部類不能有靜態聲明,無論是靜態初始快,還是靜態屬性、方法
private static int count = 100;
//Error: 非靜態內部類不能有靜態聲明,無論是靜態初始快,還是靜態屬性、方法
public static void hello()
{
}
private int id=1000;
{
System.out.println("內部類普通初始化塊執行!");
}
public InnerClass()
{
System.out.println("內部類構造方法執行!");
}
public int getID()
{
eyecount = 128128;//外部類靜態成員
eyecount++;
return count;//外部類中的count
}
}
//外部類代碼
public InnerClass getInner()//如果內部類爲private,則返回的InnerClass實例不能用來訪問其屬性或方法.儘管可以返回實例引用!
{
InnerClass inner = new InnerClass();
System.out.println("外部類count="+inner.getID()+" ;外部類靜態成員eyecount="+eyecount);
System.out.println("OutterClass.eyecount(static)="+OutterClass.eyecount);
return inner;
}
//外部類靜態方法
public static test()
{
new InnerClass();//Error : 外部類靜態方法不能訪問非靜態內部類。就如靜態方法不能訪問非靜態成員變量。
}
}
//測試
class Test
{
public static void main(String[] args)
{
OutterClass outer = new OutterClass() ;
System.out.println(outer.getInner());//OK
//System.out.println(outer.getInner().getID());//錯誤。不能調用getID(),因爲內部類爲private,儘管可以返回實例
}
}
package lesson8;
//外部類
class OutterClass
{
private int count=1008;
private static int eyecount;
//內部類
private class InnerClass
{
/*static 非靜態內部類不能有靜態聲明,無論是靜態初始快,還是靜態屬性、方法
{
System.out.println("內部類靜態初始化塊執行!");
}*/
//Error:原因 非靜態內部類不能有靜態聲明,無論是靜態初始快,還是靜態屬性、方法
//private static int count = 100;
//Error: 非靜態內部類不能有靜態聲明,無論是靜態初始快,還是靜態屬性、方法
/*public static void hello()
{
}*/
public int innerID = 518;
private int id=1000;
{
System.out.println("內部類普通初始化塊執行!");
}
public InnerClass()
{
System.out.println("內部類構造方法執行!");
}
public int getID()
{
/*
內部類可以直接訪問外部類的成員變量(或方法),無論外部類成員變量(或方法)訪問權限如何
*/
Hello();
eyecount = 128128;//外部類靜態成員
eyecount++;
return count;//外部類中的count
}
}
//外部類代碼
private void Hello()
{
System.out.println("外部類 Hello!");
}
public InnerClass getInner()//如果內部類爲private,則返回的InnerClass實例不能用來訪問其屬性或方法.儘管可以返回實例引用!
{
InnerClass inner = new InnerClass();
/*
外部類不能直接訪問內部類的屬性或方法,必須通過實例引用纔可以訪問。無論內部類成員變量(或方法)訪問權限如何
*/
//innerID = 518518;//Error:必須通過實例引用纔可使使用內部類變量或方法
inner.innerID = 518518;//OK
System.out.println("外部類count="+inner.getID()+" ;外部類靜態成員eyecount="+eyecount);
System.out.println("OutterClass.eyecount(static)="+OutterClass.eyecount);
return inner;
}
}
//測試類
class Test
{
public static void main(String[] args)
{
OutterClass outer = new OutterClass() ;
System.out.println(outer.getInner());//OK
//System.out.println(outer.getInner().getID());//錯誤。不能調用getID(),因爲內部類爲private,儘管可以返回實例
}
}
靜態內部類:
靜態內部類是屬於外部類整個類的,不屬於外部類的某個實例對象。靜態外部類實例不寄存與外部類實例之中。
靜態內部類不能引用外部類的非靜態成員。