內(nèi)部類是Java語(yǔ)言一個(gè)重要的基本特性,在Java開發(fā)的許多領(lǐng)域都會(huì)經(jīng)常用到。內(nèi)部類的定義說簡(jiǎn)單一點(diǎn)就是將一個(gè)類定義在另外一個(gè)類的內(nèi)部。內(nèi)部類允許你把一些邏輯相關(guān)的類組織在一起,控制內(nèi)部類代碼的可視性,它和類的組合是完全不同的概念。內(nèi)部類主要有以下比較關(guān)鍵的特性:
1. 普通的非內(nèi)部類不能被聲明為private或protected,否則就失去了創(chuàng)建該類的意義。但是內(nèi)部類通常可以被聲明為private或protected類型,因?yàn)檫@樣可以防止他人對(duì)該內(nèi)部類實(shí)現(xiàn)的功能進(jìn)行修改,達(dá)到隱藏實(shí)現(xiàn)細(xì)節(jié)的目的。例如:
class Fruit {
private class Weight {
private String i;
private Weight(String j) {
i = j;
}
public String read() {
return i;
}
}
}
class test {
public static void main(String[] args) {
Fruit f = new Fruit();
f.Weight w = f.new Weight(); //不能訪問private類,如果Weight為protected類型則可以
}
}
2. 在方法或某控制語(yǔ)句(if/for/while等)的作用域內(nèi)定義內(nèi)部類,將只能在該范圍內(nèi)調(diào)用內(nèi)部類的方法和成員變量。
3. 匿名內(nèi)部類是一種特殊的內(nèi)部類,如果希望它使用一個(gè)在其外部定義的對(duì)象,那么編譯器會(huì)要求其參數(shù)引用是final的。
public class Fruit {
public Tea cont(final int j) {
return new Tea() {
private int i = j;
public int read() {
return i;
}
}; //注意這里的分號(hào)
}
public static void main(String[] args) {
Fruit f = new Fruit();
Tea t = f.cont;
}
}
而當(dāng)方法cont(final int j)中的參數(shù)j只是被傳遞到匿名類中的構(gòu)造器時(shí),可以不用被聲明為final類型,如return new Tea(j)。這里提到了匿名內(nèi)部類的構(gòu)造器,那么它是怎么被初始化的呢?
public class Fruit {
public Tea cont(int j) {
return new Tea(j) {
System.out.println(j);
};
}
}
還可以這樣初始化匿名內(nèi)部類:
public class Fruit {
public Tea cont(final int j) {
return new Tea(j) {
int i;
// 初始化匿名內(nèi)部類
{
i = j;
System.out.print(i);
}
};
}
}
方法cont()可以被稱為實(shí)例初始化方法,使得匿名內(nèi)部類通過構(gòu)造器而被初始化,在實(shí)際應(yīng)用中,我們不能重載實(shí)例初始化方法,因?yàn)槟涿麅?nèi)部類只能有一個(gè)構(gòu)造方法。