嵌套類別指定義在另一個類別的內部的類,嵌套類別的存在只是為了他的外圍類別。巢狀類別有四種:靜態成員類,非靜態成員類,匿名類別,局部類別。
靜態成員類別是最簡單的一種巢狀類別。最好把它看做是一個普通的類,只是剛好定義在另一個類別的內部。靜態成員類別可以存取外圍類別的所有成員,包括那些私有的變數。靜態成員類別同樣遵守可訪問性規則,如果將它定位私有,它就指在外圍類別的內部才能存取。
public class PhotoListAdapter extends RecyclerView.Adapter<PhotoListAdapter.ImageVH> { static class ImageVH extends RecyclerView.ViewHolder { //代码省略 } }
在Android中 最熟悉listview的ViewHolder我們通常使用的就是靜態成員類,通常作為一個公有的輔助類。作為Listview的緩存變數緩存view中佈局。
私人靜態成員類,用來代表外圍類別所代表的物件的元件。
程式碼如下
非靜態成員類別與靜態成員類別的語法差異在於是否有修飾符static 。儘管它們的語法很像,但是兩者的差異很大。非靜態成員類別的每個實例都隱含這與外部類別的外圍實例相關聯,非靜態成員類別實例方法內部,可以呼叫外圍實例上的方法,只有靜態成員類別的實例可以在外圍類別獨立存在,沒有外圍實例的情況下,無法建立非靜態成員類別的實例。
當非靜態成員類別的實例創建,它與外圍實例之間的關聯也隨之被建立,而且這種關聯關係以後不能被修改。 這個關聯通常發生在外圍類別的某個實例方法呼叫了非靜態成員類別的建構器時。 這種關聯關係需要消耗非靜態成員類別實例的空間,並增加了建構的時間開銷。 如果成員類別不需要存取週邊類別實例 請加上static修飾詞 。
public class PhotoListAdapter extends RecyclerView.Adapter<PhotoListAdapter.ImageVH> { class ImageVH extends RecyclerView.ViewHolder { // 真是对外部类的实例持有,在Android开发中很大部分activity中的context的内存泄露因为这个原因。 } }
匿名類別不同與JAVA的其他語法單元,匿名類別沒有名字,它不是外圍類別的一個成員,它不與其他的成員一起被申明,而是在使用的同時被聲明實例化。匿名類別可以出現在程式碼任何存在表達式的地方。只有匿名類別出現在非靜態的環境中,他才有外圍實例,即使它聲明在靜態的環境中,也不可能擁有任何靜態成員。
imageView.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { // 代码省略 } });
局部類別在任何"可以宣告局部變數"的地方宣告。同樣遵守作用域規則,1. 局部類別擁有名字,可以重複使用。 2. 與匿名類,只有當局部類別是在非靜態環境定義的時候,才有外圍實例,不能包含靜態成員。
public class mainActivity extends Activity{ private Handler handler = new Handler(){ @Override public void handleMessage(Message msg) { // 此处同样可能引起context持有导致的内存泄露 } }; }
以上是java嵌套類Android開發必知的詳細內容。更多資訊請關注PHP中文網其他相關文章!