在Java中,允許在一個類的內部定義類,這樣的類稱作內部類,這個nei’bu類所在的類稱爲外部類。
內部類的分類:
成員內部類
局部內部類
靜態內部類(靜態成員內部類)
匿名內部類
成員內部類
在一個類中,除了可以定義成員變量、成員方法,還可以定義類,這樣的類被稱作成員內部類。
在成員內部類中,可以訪問外部類中的所有成員,包括成員變量與成員方法;在外部類中,同樣可以訪問成員內部類的變量與方法。
創建內部類對象的具體格式如下:
外部類名.內部類名 變量名 = new 外部類名().new 內部類名();
下面看代碼如何實現內部類與外部類的各種關係
package jiCheng_duoTai;
//不論是內部類還是外部類都會生成字節碼文件
//可以生成內部類對象也可以生成外部類對象
public class NeiBuLeiYuWaiBuLei {
public static void main(String[] args) {
Outer.Inner oi = new Outer().new Inner();//創建生成內部類對象
oi.inMethod();
//System.out.println("in:"+oi.innum);
Outer out = new Outer();
out.outMethod();
}
}
class Outer{
int num=101;
public void outMethod() {
System.out.println("out");
Inner nn = new Inner();//創建內部類的對象
System.out.println("in:"+nn.innum);
nn.inMethod();
}
//Inner是成員內部類,和定義一個普通類是一樣的
class Inner{//內部類,是在Outer這個類中寫的,所以Outer是外部類
int innum=999;
public void inMethod() {
System.out.println("out:"+num);//調用外部類的成員變量,當然也可以調用外部類的成員方法
System.out.println("in");
//outMethod();調用外部類的成員方法。兩個方法不能互相調用( nn.inMethod();),那麼就無限循環了,要是想調用,必須有終止條件
}
}
}
下面的代碼也可以說明內部類與外部類之間的關係
局部內部類
靜態內部類
注意:靜態是直接通過類名進行調用的
匿名內部類
注意:匿名內部類是沒有名稱的類,所以不能通過class去創建類
通過一段代碼,看一下如何創建匿名類
package jieKou;
interface Animal {
void shout();
}
public class Animal_NiMingLei{
public static void main(String[] args) {
String name="xiao花xiao花";
//定義匿名內部類作爲參數傳給animalShout方法
animalShout(new Animal() {//new的時候用接口的名字或者父類的名字進行創建匿名類
public void shout() {//必須要重寫接口中的方法
System.out.println(name+"喵喵······");
}
});
}
//定義靜態方法,接口接收類型參數
public static void animalShout(Animal an) {
an.shout();
}
}