Android——記面試問題

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的幾種情況

  1. 加載大圖
  2. 文件流使用完沒有釋放
  3. 非靜態內部類持有外部引用,並設置靜態修飾
  4. 內部類Handler的使用
  5. Bitmap使用後未調用recycle()

先到這裏,有時間繼續。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章