內部類
內部類是指在一個外部類的內部再定義一個類,可用protected和private 修飾。而外部類只能使用public和缺省的包訪問權限。
注意:內部類只是一個編譯時期的概念,一量編譯成功,就會成爲完全不同的兩類。
特點:
1,內部類可以直接訪問外部類的東西
2,外部類要訪問內部類的東西要先建立對象
爲什麼需要內部類?
內部類繼承自某個類或實現某個接口,內部類的代碼操作創建其外圍類的對象,所以可以認爲內部類提供了某種進入其外圍類的方法。
好處:每個內部類都能獨立的去繼承實現接口,所以無論外圍類是否已經繼承了某個實現,對於內部類都沒有影響,內部類有效的實現了“多重繼承”。
內部類可以分爲4種:
1,靜態內部類
使用static 修飾,聲明在外部類的類體中。靜態內部類中可以訪問外部類的靜態成員。
如果你不需要內部類與其外圍類之間有聯繫,那麼可以聲明爲satic。
2,成員內部類
一,聲明在外部類的類體中,不使用static 修飾,具有類的成員特徵,必須有類的實例纔會創建內部類實例。
二,內部類實例可以訪問共享外部類的成員變量。
3,局部內部類
把類聲明在方法中,類似局部變量。(很少見)
例:
void fanfa(){
final int a=3; //這裏加final 下面這個局部類才能訪問
class Demoin{
void display(){
//注意局部裏面的類要訪問的變量必須是final 最終的
System.out.println (a);
}
}
new Demoin().display();
}
4,匿名內部類(重點)
匿名類和內部類差不多,只是類名沒體現出來。
1,匿名內部類其實就是內部類的簡寫格式
2,定義匿名內部類的前提: 內部類必須繼承一個類或者實現接口
3,匿名內部類的格式: new 父類或者接口(){定義子類的內容}
4,其實匿名內部類就是一個匿名子類對象。可以理解爲帶內容的對象
5, 匿名內部類中定義的方法最好不要超過3個。
6,匿名類,非常常見,可以寫在任何地方,就像一般的語句。
7,匿名類是對原類的一個繼承,同時創建了實例,{}就是繼承以後的類體,類體中可以使用所有類的語法。
8,匿名類不能寫構造器。
9,匿名類可以從抽象類或者接口繼承。
10,匿名內部類不能定義任何靜態成員、方法和類。
11,匿名內部類不能是public, protected, private, staic .
12,匿名類只能創建其自身那一個實例。
那些地方使用匿名內部類呢?
1,只用到類的一個實例。
2,類在定義後馬上用到。
心得:內部類就是類體裏面在建立一個類,這個內部類可以去繼承其它類,或實現接口。提供了訪問外圍類的路徑,把 類的單繼承進行了改善。其中匿名類是重點,在使用中應用最多。內部類可以訪問外圍類的資源,要注意它們的
寫法。
例一:
abstract class Demo
{
abstract void show();
}
class Out
{
int x = 3;
// class In extends Demo
// {
// void show(){
// System.out.println("show.."+x);
// }
// }
void dis()
{
// In in=new In();
// in.show();
//匿名類使用方法,上面的內部類使用可以用下面匿名類來實現,少寫代碼
new Demo()
{
void show(){ //覆蓋
System.out.println("show.."+x);
}
}.show();
//也可以給上面這個對象取名,如下:功能一樣
// Demo d=new Demo()
// {
// void show(){ //覆蓋
// System.out.println("show.."+x);
// }
// };
// d.show();
}
}
class OutIn
{
public static void main(String[] args)
{
Out out=new Out();
out.dis();
}
}
例二:
class Out
{
private int x=3;
class In
{
int x=4;
void function(){
int x=6;
//訪問x=6 直接寫x
//訪問x=4 寫this.x
//訪問外部類x=3 得寫成 Out.this.x
//如果內部類裏和方法裏沒有定義x 直接訪問外部類的x
System.out.println("In.."+Out.this.x);
}
}
void show(){
System.out.println(x);
//訪問內部類,得先建立對象
In in=new In();
in.function();
}
//局部類使用
void fanfa(){
final int a=3; //這裏加final 下面這個局部類才能訪問
class Demoin{
void display(){
//注意局部裏面的類要訪問的變量必須是final 最終的
System.out.println (a);
}
}
new Demoin().display();
}
}
class OutIn
{
public static void main(String[] args)
{
Out out=new Out();
out.show();
//直接建立內部類,用下面方式(內部類必須是非靜態的)
Out.In oi=new Out().new In();
oi.function();
}
}