一分鐘搞定Java高頻面試題

一分鐘搞定Java高頻面試題

一、變量賦值和計算

題目:

    public static void main(String[] args) {
    int i = 1;
        i = i++;
        int j = i++;
        int k = i + ++i * i++;
        System.out.println("i=" + i);
        System.out.println("j=" + j);
        System.out.println("k=" + k);
    }

分析:

①把i的值壓入操作數棧
②i變量自增1
③把i的值壓入操作數棧
④把i的值壓入操作數棧
⑤i變量自增1
⑥把操作數棧中前兩個彈出求乘積結果再壓入棧
⑦把操作數棧中的值彈出求和再賦值給k

總結:

賦值=,最後計算
=右邊的從左到右加載值依次壓入操作數棧
實際先算哪個,看運算符優先級
自增、自減操作都是直接修改變量的值,不經過操作數棧
最後的賦值之前,臨時結果也是存儲在操作數棧中

二、類的初始化、實例初始化、方法重載和重寫

考點:

  • 類初始化過程
  • 實例初始化過程
  • 方法的重寫

題目

題目2

一、類初始化過程

一個類要創建實例需要先加載並初始化該類
main方法所在的類需要先加載和初始化
一個子類要初始化需要先初始化父類
一個類初始化就是執行()方法
()方法由靜態類變量顯示賦值代碼和靜態代碼塊組成
類變量顯示賦值代碼和靜態代碼塊代碼從上到下順序執行
()方法只執行一次

二、實例初始化

實例初始化就是執行()方法
()方法可能重載有多個,有幾個構造器就有幾個方法
()方法由非靜態實例變量顯示賦值代碼和非靜態代碼塊、對應構造器代碼組成
非靜態實例變量顯示賦值代碼和非靜態代碼塊代碼從上到下順序執行,而對應構造器的代碼最後執行
每次創建實例對象,調用對應構造器,執行的就是對應的方法
方法的首行是super()或super(實參列表),即對應父類的方法

三、方法的重寫 Override 和重載 Overload

重載Overload表示同一個類中可以有多個名稱相同的方法,但這些方法的參數列表各不相同(即參數個數或類型不同)。

重寫Override表示子類中的方法可以與父類中的某個方法的名稱和參數完全相同,通過子類創建的實例對象調用這個方法時,將調用子類中的定義方法,這相當於把父類中定義的那個完全相同的方法給覆蓋了,這也是面向對象編程的多態性的一種表現。子類覆蓋父類的方法時,只能比父類拋出更少的異常,或者是拋出父類拋出的異常的子異常,因為子類可以解決父類的一些問題,不能比父類有更多的問題。子類方法的訪問權限只能比父類的更大,不能更小。如果父類的方法是private類型,那麼,子類則不存在覆蓋的限制,相當於子類中增加了一個全新的方法。

  • 哪些方法不可以被重寫
    final方法
    靜態方法
    private等子類中不可見方法

  • 對象的多態性
    子類如果重寫了父類的方法,通過子類對象調用的一定是子類重寫過的代碼
    非靜態方法默認的調用對象是this
    this對象在構造器或者說方法中就是正在創建的對象

四、Override重寫的要求?

1、覆蓋的方法的標誌必須要和被覆蓋的方法的標誌完全匹配,才能達到覆蓋的效果;

2、覆蓋的方法的返回值必須和被覆蓋的方法的返回一致;

3、覆蓋的方法所拋出的異常必須和被覆蓋方法的所拋出的異常一致,或者是其子類;

4、被覆蓋的方法不能為private,否則在其子類中只是新定義了一個方法,並沒有對其進行覆蓋。

三、方法的參數傳遞、String、包裝類等對象的不可變性

一、題目:

題目3

二、方法的參數傳遞機制

  • 形參是基本數據類型
    • 傳遞數據值
  • 實參是引用數據類型
    • 傳遞地址值
    • 特殊的類型:String、包裝類等對象不可變性

四、成員變量與局部變量

一、題目

題目4

二、分析

1)、考點

1、就近原則
2、變量的分類

  • 成員變量:類變量、實例變量
  • 局部變量

3、非靜態代碼塊的執行:每次創建實例對象都會執行
4、方法的調用規則:調用一次執行一次

2)局部變量與成員變量的區別:

  • 聲明的位置
    • 局部變量:方法體{}中,形參,代碼塊{}中
    • 成員變量:類中方法外
    • 類變量:有static修飾
    • 實例變量:沒有static修飾
  • 修飾符
    • 局部變量:final
    • 成員變量:public、protected、private、final、static、volatile、transient
  • 值存儲的位置
    • 局部變量:棧
    • 實例變量:堆
    • 類變量:方法區

3)變量分析

變量分析

4)局部變量與成員變量的區別

  • 作用域
    • 局部變量:從聲明處開始,到所屬的}結束
    • 實例變量:在當前類中「this.」(有時this.可以缺省),在其他類中「對象名.」訪問
    • 類變量:在當前類中「類名.」(有時類名.可以省略),在其他類中「類名.」或「對象名.」訪問
  • 生命周期
    • 局部變量:每一個線程,每一次調用執行都是新的生命周期
    • 實例變量:隨着對象的創建而初始化,隨着對象的被回收而消亡,每一個對象的實例變量是獨立的
    • 類變量:隨着類的初始化而初始化,隨着類的卸載而消亡,該類的所有對象的類變量是共享的

不同變量在JVM中的存儲位置

三、當局部變量與xx變量重名時,如何區分

  • 局部變量與實例變量重名在實例變量前面加 「this.」
  • 局部變量與類變量重名在類變量前面加 「類名.」

本文由博客群發一文多發等運營工具平台 OpenWrite 發佈