“簡(jiǎn)單不先于復(fù)雜,而是在復(fù)雜之后.” —— Alan Perlis
s.jpg
內(nèi)部類(lèi)
- 在Java中,可以將一個(gè)類(lèi)定義在另一個(gè)類(lèi)里面或者一個(gè)方法里面,這樣的類(lèi)稱(chēng)為內(nèi)部類(lèi)。內(nèi)部類(lèi)是一種非常有用的特性,因?yàn)樗试S你把一些邏輯相關(guān)的類(lèi)組織在一起,并控制位于內(nèi)部的類(lèi)的可視性。
廣泛意義上的內(nèi)部類(lèi)一般分為以下幾種類(lèi)型:
- 成員內(nèi)部類(lèi)
最普通的內(nèi)部類(lèi),它定義在另一個(gè)類(lèi)的內(nèi)部,如下所示
//外部類(lèi)
class Out {
private int age = 12;
//內(nèi)部類(lèi)
class In {
public void print() {
System.out.println(age);
}
}
}
public class NormalInnerClass {
public static void main(String[] args) {
Out.In in = new Out().new In();
in.print();
//或者采用下種方式訪問(wèn)
/*
Out out = new Out();
Out.In in = out.new In();
in.print();
*/
}
}
- 局部?jī)?nèi)部類(lèi)
局部?jī)?nèi)部類(lèi)是定義在一個(gè)方法或者一個(gè)作用域里面的類(lèi),它和成員內(nèi)部類(lèi)的區(qū)別在于局部?jī)?nèi)部類(lèi)的訪問(wèn)僅限于方法內(nèi)或者該作用域內(nèi)。
interface extendInnerClass{
public int setAge();
}
//外部類(lèi)
class Out {
private int age = 12;
public extendInnerClass getInnerClass(){
// 局部?jī)?nèi)部類(lèi)
class innerClass implements extendInnerClass{
public int setAge(){
age++;
return age;
}
}
return new innerClass();
}
}
public class NormalInnerClass {
public static void main(String[] args) {
Out out = new Out();
System.out.println(out.getInnerClass().setAge());
}
}
注意,局部?jī)?nèi)部類(lèi)就像是方法里面的一個(gè)局部變量一樣,是不能有public、protected、private以及static修飾符的。
靜態(tài)內(nèi)部類(lèi)
class Out3 {
private static int age = 12;
static class In {
public void print() {
System.out.println(age);
}
}
}
public class staticInnerClass {
public static void main(String[] args) {
Out3.In in = new Out3.In();
in.print();
}
}
可以看到,如果用static 將內(nèi)部?jī)?nèi)靜態(tài)化,那么內(nèi)部類(lèi)就只能訪問(wèn)外部類(lèi)的靜態(tài)成員變量,具有局限性
其次,因?yàn)閮?nèi)部類(lèi)被靜態(tài)化,因此Out.In可以當(dāng)做一個(gè)整體看,可以直接new 出內(nèi)部類(lèi)的對(duì)象(通過(guò)類(lèi)名訪問(wèn)static,生不生成外部類(lèi)對(duì)象都沒(méi)關(guān)系)
- 匿名內(nèi)部類(lèi)
匿名內(nèi)部類(lèi)是唯一一種沒(méi)有構(gòu)造器的類(lèi)。正因?yàn)槠錄](méi)有構(gòu)造器,所以匿名內(nèi)部類(lèi)的使用范圍非常有限,大部分匿名內(nèi)部類(lèi)用于接口回調(diào)。匿名內(nèi)部類(lèi)在編譯的時(shí)候由系統(tǒng)自動(dòng)起名為Outter$1.class。一般來(lái)說(shuō),匿名內(nèi)部類(lèi)用于繼承其他類(lèi)或是實(shí)現(xiàn)接口,并不需要增加額外的方法,只是對(duì)繼承方法的實(shí)現(xiàn)或是重寫(xiě)。