內部類的訪問規則:
1、內部類可以直接訪問它所在外部類中的成員,包括私有成員。內部類之所以能直接訪問外部類中的成員,就是因爲內部類持有一個外部類的引用,格式:外部類.this
class Outer
{
private int x=1;
class Inner
{
int x=3;
void show()
{
System.out.println("Inner:"+Outer.this.x);
}
}
}
2、外部類要訪問內部類,必須建立內部類的對象。
訪問格式:
1、當內部類定義在外部類的成員位置上,而且非私有,可以在外部其他來中直接建立內部類對象。格式:外部類名.內部類名 變量名=new 外部類名().內部類名()。比如Outer.Inner in=new Outer().Inner();
2、當內部類在成員位置上時,就可以被成員修飾符所修飾。比如,private:將內部類在外部類中進行封裝
static:用static修飾時,內部類就具備了static的特性,而且此時內部類只能直接訪問外部類中的static成員,出現了訪問的侷限性。
在外部類中如何訪問static內部類的非靜態成員呢?new Outer.Inner().show()
在外部其他類中,如何直接訪問static內部類中的靜態成員呢?Outer.Inner.show()
注意:當內部類中定義了靜態成員時,該內部類必須是static的。
當外部類中的靜態方法訪問內部類時,內部類也必須是static的。
說這麼多,很多人會疑惑什麼時候定義內部類?我們都知道類就是對事物的描述,而內部類顯而言之就是事物的內部還有事物,這時就用內部類描述。
當內部類定義在局部時:
1、不可以被成員修飾符修飾
2、可以直接訪問外部類中的成員,因爲還持有外部類的引用,但是不可以訪問它所在的局部中的變量,只能訪問被final修飾的局部變量。
匿名內部類:
1、匿名內部類其實就是內部類的簡寫格式。
2、定義匿名內部類的前提:
內部類必須是繼承一個類或者實現一個接口
3、匿名內部類對象的格式:new 父類或者接口(){定義子類的內容}.子類方法
4、匿名內部類中定義的方法最好少於三個,因爲定義匿名內部類的時候需要繼承父類或者實現接口,如果方法太多,就達不到簡化代碼的效果,還不如帶有名字的的內部類。