一、嵌套類的種類
1、靜態成員類(在類內部的類)
public class MyClass{
\\...
public static class MyMember{
\\...
}
}
2、成員類(靜態與非靜態的區別在於static)
public class MyClass{
\\...
public class MyMember{
\\...
}
}
3、局部類(在方法內的類)
public class MyClass {
//...
public void myMethod(){
//...
class Memeber{
//...
}
}
}
4、匿名類(在調用方法內的類)
mBtn.setOnClickListener{
new OnClickListener(){
@Override
public void onClick(){
//...
}
}
};
二、靜態成員類與非靜態成員的區別
①、持有外部類的引用
非靜態成員類隱含持有外部類的引用,通過XXClass.this來獲取外部類的引用。
也就是說能夠獲取外部類的所用成員變量與成員方法。
public class MyType {
private int firstData;
private int secondData;
private int getFirstData(){
return firstData;
}
private int getSecondData(){
return secondData;
}
public class Style{
public void getStyle(){
//獲取外圍類成員變量
int first = firstData;
//獲取外圍了的方法
int second = getFirstData();
//獲取外圍了的引用
MyType type = MyType.this;
}
}
}
然而靜態成員變量就無法持有外圍類的引用。只能獲取外圍類的static的成員變量和方法。public class MyType {
private static int firstData;
private int secondData;
private static int getFirstData(){
return firstData;
}
private int getSecondData(){
return secondData;
}
public static class Style{
public void getStyle(){
int first = firstData;
int f = getFirstData();
//報錯:int second = secondData;
//報錯:MyType myType = MyType.this;
}
}
}
②、靜態成員類能夠脫離外圍實例獨立存在。就是說:不用創建外圍類,就可以創建靜態成員類。但是普通成員類就必須先創建外圍實例。
靜態成員類:
public static void main(String[] args) {
// TODO Auto-generated method stub
//不用創建MyType就能單獨創建實例
MyType.Style style = new MyType.Style();
}
普通成員類: public static void main(String[] args) {
// TODO Auto-generated method stub
//必須要先創建MyType才能創建Style
MyType.Style style = new MyType().new Style();
}
三、靜態與非靜態成員類的實例
靜態成員類:(作爲枚舉類)
public class Main {
private Fruit mFruit = Fruit.APPLE;
public void setFruit(Fruit fruit){
mFruit = fruit;
}
public enum Fruit{
APPLE,
ORANGE,
BANANA
}
}
非靜態成員類:(作爲容器的迭代器)public class MyList <E> extends AbstractList<E>{
@Override
public E get(int index) {
// TODO Auto-generated method stub
return null;
}
@Override
public int size() {
// TODO Auto-generated method stub
return 0;
}
@Override
public Iterator<E> iterator() {
// TODO Auto-generated method stub
return new MyIterator<E>();
}
private class MyIterator<T> implements Iterator<T>{
private int current;
@Override
public boolean hasNext() {
// TODO Auto-generated method stub
//設定一個計時器,與List的數量比較
if (current < size()){
return true;
}
return false;
}
@Override
public T next() {
// TODO Auto-generated method stub
return null;
}
}
}
四、何時使用靜態成員與非靜態成員類
當成員類不要求訪問外圍成員的時候,就需要將嵌套類設置成靜態成員類。
因爲非靜態成員類會持有外圍類的引用,這樣會導致,當外圍類可以被垃圾回收機制回收的時候,由於非靜態成員持有外圍實例,導致外圍類無法釋放,佔用內存。