目錄
1.final的注意事項
一般常量聲明使用‘final,沒有深究這個。
當final修飾一個基本數據類型時,表示該基本數據類型的值一旦在初始化後便不能發生變化;如果final修飾一個引用類型時,則在對其初始化之後便不能再讓其指向其他對象了,但該引用所指向的對象的內容是可以發生變化的。
public final Date date = new Date();
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
//錯誤
date = new Date();
//正確
date.setTime(new Date().getTime());
}
2.靜態方法可以被new出來的對象調用
public class A {
public static void tetsA(){
Log.d("tetsA", "tetsA: ");
}
}
調用
A.tetsA();
A a = new A();
a.tetsA();
3.java繼承關係中爲什麼靜態方法不能重寫呢
靜態方法是類在加載時就被加載到內存中的方法,在整個運行過程中保持不變,因而不能重寫。但非靜態方法是在對象實例化時才單獨申請內存空間,爲每一個實例分配獨立的運行內存,因而可以重寫。
4.記一個LinearLayout佈局問題
橫向排列,三個控件第一個wrap_content,第二個weight=1,wrap_content
,第三個weight=1,layout_width=200dp
我本以爲layout_width=200dp沒有什麼作用,但經過測試後,發現有作用。
問第二個控件與第三個控件那個大?
在weight相同的情況下,layout_width大,控件就大。
因爲系統先按照view的layout_width和layout_height來佈局,然後再根據layout_weight對剩餘的父控件空間進行分配。
橫向排列,三個控件第一個match_parent,第二個weight=1,第三個weight=1
這個不復雜,只要理解match_parent。
match_parent表示讓當前控件的大小和父佈局的大小一樣,也就是由父佈局來決定當前控件的大小。
導致的效果是:只顯示第一個控件,其他兩個控件都擠出屏幕了。
5.public/private/protected/default作用域的比較
作用域與可見性 | 當前類 | 同一package | 子類 | 其他package |
---|---|---|---|---|
Public | 能 | 能 | 能 | 能 |
Protected | 能 | 能 | 能 | 否 |
Default | 能 | 能 | 否 | 否 |
Private | 能 | 否 | 否 | 否 |
6.內存溢出與內存泄漏
內存溢出:指程序在申請內存時,沒有足夠的內存空間供其使用。比如申請了一個integer,但給它存了long才能存下的數。
內存泄漏: 程序在申請內存後,無法釋放已申請的內存空間
7.Handler爲什麼可能會造成內存泄漏?
handler的實例採用了內部類的寫法,它是Activity這個實例的內部類。在java中,非靜態的內部類和匿名內部類都會隱式的持有一個外部類的引用。所以,該handler實例持有了Activity的一個引用。
activity在finish後,該實例的handler內部類引用了activity,而該handler實例可能被MessageQueue引用着。比如發送了一個延時消息到隊列中,那麼就可能在隊列中存在很長時間,因此非靜態內部類也會長時間持有activity的引用,activity被引用,阻止了MainActivity被垃圾回收器回收。
8.單例雙重校驗鎖中的volatile作用
防止產生指令的重排序問題
單例中的一段代碼
if(s == null) { //a
s = new Singleton(); //b
}
b中會執行如下
1 memory=allocate();// 分配內存 相當於c的malloc
2 ctorInstanc(memory) //初始化對象
3 s=memory //設置s指向剛分配的地址
在編譯器運行時,可能會出現重排序 從1-2-3 排序爲1-3-2。線程A在執行第b行代碼時,B線程進來,而此時A執行了 1和3,沒有執行2,此時B線程判斷s不爲null 直接返回一個未初始化的對象,就會出現問題。
9.OOM的幾種情況
- 加載大圖
- 文件流使用完沒有釋放
- 非靜態內部類持有外部引用,並設置靜態修飾
- 內部類Handler的使用
- Bitmap使用後未調用recycle()
先到這裏,有時間繼續。