內部類與匿名內部類的概念與使用
以前Android開發的時候,有時候會看到內部類比如定義Adapter的ViewHolder和匿名內部類比如各種事件等。但是對於內部類與匿名內部類的概念以及裡面的一些細節卻比較模糊,如今我總結如下:
概念
內部類是定義在類中的類。內部類的主要作用是將邏輯上相關的類放到一起。
匿名類是特殊的內部類,沒有類名。在定義類的同時,就生成該類的一個例項,並且不會在其他地方用到該類,所以不用起名字,因而又稱匿名內部類。
內部類
內部類可以看作是外部類的一個成員,與一般類相同,內部類可以擁有自己的成員變數與成員方法,通過建立內部類物件,可以訪問其成員變數和呼叫成員方法。下面具體看一個簡單的例項:
public class Person {
private String name;
// 內部類
public class Student {
private String sex;
public Student(String n, String sex) {
name = n; //賦值給外部類成員變數,所以可以將內部類看作是外部類的一個成員
this.sex = sex;
}
public void output() {
System.out .println("學生姓名是:" +name + " " + "學生性別是:" + sex);
}
}
//外部類方法中呼叫內部類方法,可以發現內部類方法與外部類方法可以相同。
public void output() {
Student s = new Student("張三", "男");
s.output();
}
public static void main(String[] args) {
//外部類直接呼叫內部類方法
// Person p = new Person();
// Person.Student s=p.new Student("張三", "男");
// s.output();//內部類的方法
// System.out.println(s.sex);//訪問內部類成員變數
//外部類方法中實現對內部類的方法呼叫
Person p=new Person();
p.output();
}
}
分析:其實在內部類物件中儲存了一個對外部類物件的引用,當在內部類的成員方法中訪問某一變數時,如果在該方法和內部類中都沒有定義過這個變數,(如果有這個變數的話,或者外部類的某個成員變數與內部類的成員變數相同,eg:在內部類中定義 private String name; 那麼訪問的則是內部類的這個變數)呼叫就會被傳遞給內部類中的那個對外部類物件的引用,通過這個引用去呼叫這個變數。在內部類呼叫外部類的方法也是同樣的一個道理(還是這個內部類物件儲存了一個對外部類的引用)。
內部類總結: 內部類可以宣告成private或protected,訪問原則是,在外部類中,通過一個內部類的物件引用內部類中的成員;而在內部類中,可以直接引用外部類的成員。包括靜態成員、例項成員、私有成員。當然,內部類也可以通過建立物件從外部類之外被呼叫,但是內部類必須宣告成public的。
注意:內部類如果被宣告成static,則靜態內部類將自動轉化為“頂層類”,即它沒有父類,而且不能引用外部類成員或其他內部類中的成員。非靜態內部類不能宣告靜態成員,只有靜態內部類才能宣告靜態成員。
匿名內部類
建立匿名內部類的用意:主要是用來彌補內部類中沒有定義到的方法,並能有效的簡化程式程式碼。
public class NoPerson {
public static void main(String[] args) {
new Inner() {
void setName(String n) {
name = n;
System.out.println("姓名是:" + name);
}
}.setName("張三");
}
static class Inner {
String name;
}
}
匿名內部類通常用來編寫“事件”的程式程式碼。