Java常考面試題(一)

一杯涼茶發表於2016-11-09

      序言

        我是一隻亂飛亂撞的菜鳥,寫的文章目前是以記錄自己學習,和方便以後檢視,期待日後不久能通過自己的努力,獲得一點小小的成功,然後寫出我的學習經驗總結性文章來。

                                                                                      ---WH


一、什麼是虛擬機器?為什麼Java被稱作是“平臺無關的程式語言”?

      自己解答:

            虛擬機器就是用來編譯我們寫的java程式,我們的程式 xxx.java 首先編譯成xxx.class 這個是位元組碼檔案,

            虛擬機器通過解析我們的位元組碼檔案,來形成計算機底層所認識的編碼,所以我們不需要知道我們寫的java程式是否能在計算機上執行,因為虛擬機器已經幫我們做了這個工作,在任何平臺上,虛擬機器都能這樣做,所以Java被稱為了平臺無關的程式語言。

 

      參考解答:

            Java虛擬機器是一個可以執行Java位元組碼的虛擬機器程式。Java原始檔被編譯成能被Java虛擬機器執行的位元組碼檔案。
            Java被設計成允許應用程式可以執行在任意的平臺,而不需要程式設計師為每一個平臺單獨重寫或者是重新編譯。Java虛擬機器讓這個變為可能,因為它知道底層硬體平臺的指令長度和其他特性。

            

      自我評價:概念模糊,沒講清楚是因為自己腦袋裡面也沒想清楚, 

            1、虛擬機器並不編譯.java成為.class位元組碼檔案, 這個事是編譯器做的,編譯器有很多種。

            2、虛擬機器做的事,將位元組碼檔案解析成機器碼檔案,也就是0101這種,為了讓計算機認識該段程式碼的意思,就是因為虛擬機器做了這個事情,所以才能在各個平臺上執行。

 

      更好的講解方式:

            虛擬機器是能夠識別java原始檔編譯後的位元組碼檔案,並將位元組碼檔案形成機器碼,讓計算機識別,因為虛擬機器知道計算機底層的一些特性,幫我們將位元組碼變成計算機所識別的編碼,所以跟平臺無關,我們只關心java原始檔的編寫就行了。

 

 

二、JDK 和 JRE 的區別是什麼?

      自己解答:

            JDK = JRE + 執行庫;也就是說jdk中包含了jre 

            jdk就是java執行的環境,java執行,就要依靠jdk的存在,

 

      參考答案:

            Java執行時環境(JRE)是將要執行Java程式的Java虛擬機器。它同時也包含了執行applet需要的瀏覽器外掛。Java開發工具包(JDK)是完整的Java軟體開發包,包含了JRE,編譯器和其他的工具(比如:JavaDoc,Java偵錯程式),可以讓開發者開發、編譯、執行Java應用程式。

 

      自我評價:概念模糊, 不清除兩者之間的關係。

            1、JDK:Java Developer's kit  Java開發工具包,

            2、JRE:Java Run Environment Java執行環境, 

            3、JRE中包括:java執行所依賴的類庫(比如String類、等等好多類,都是屬於JRE中的),JVM(虛擬機器)等一些東西

            4、JDK包括:JRE 和 編譯器、其他一些工具(偵錯程式)等。目的是讓開發者開發、編譯、執行java應用程式。

      

      更好的講解方式:

          JDK包括了JRE 和 一些工具(編譯器,偵錯程式) 來使開發者開發、編譯、和執行java程式, 而JRE中有重要的 JVM(Java虛擬機器)、一些執行的類庫 等東西。

 

三、”static”關鍵字是什麼意思?Java中是否可以覆蓋(override)一個private或者是static的方法?

      自己解答:

          static:靜態的,能夠作用在屬性、方法上面,

          作用在屬性上面,意思是在該類中就只有一份,獨一無二,每個物件都能共享它,並且能直接通過類呼叫該屬性

          作用在方法上面,該方法能被類直接呼叫,

          注意:靜態方法不能呼叫被static修飾的方法或者屬性, 而非靜態方法沒有限制,

          不能說覆蓋private修飾的方法,因為覆蓋的前提就要有繼承關係,private的作用域只供本類可見,自己的子類也對其進行隱藏,能寫成一樣的方法,但那不是覆蓋

          也不能重寫static方法,感覺是這樣,理由不知道。

 

      參考答案:

          “static”關鍵字表明一個成員變數或者是成員方法可以在沒有所屬的類的例項變數的情況下被訪問。
          Java中static方法不能被覆蓋,因為方法覆蓋是基於執行時動態繫結的,而static方法是編譯時靜態繫結的。static方法跟類的任何例項都不相關,所以概念上不適用。

      

      自我評價:答對了一半吧。static修飾成員變數和修飾方法答得差不錯,但後面一問就有點疑問了。

          1、static修飾成員變數和方法

          2、修飾成員變數:整個類的例項共享該屬性,可通過類直接呼叫該屬性

          3、修改方法:類可以直接呼叫該方法,靜態方法只能呼叫static修飾過的變數和類中的方法。而非靜態方法沒有限制,

          4、注意:static修飾過的成員變數或方法,跟著類的載入就載入到了記憶體,所以類可以直接呼叫這些修飾過的屬性和方法,而靜態方法只能呼叫static修飾過的屬性和方法也是因為這個原因,靜態屬性和方法先於非靜態屬性和方法載入,所以靜態方法呼叫屬性時,非靜態還沒載入完呢, 而當非靜態呼叫靜態時,就沒有這個顧慮。

          5、覆蓋,也就是重寫, 前提條件是需要繼承,父類中用private修飾的方法,對子類都不可見,繼承不了,所以沒有所謂的重寫

          6、不能重寫static的方法,原因是 static在編譯時期靜態繫結的, 而方法的重寫是基於執行時動態繫結的,而且static方法跟類的例項沒有任何的關係。

          7、又丟擲了執行時繫結的一些相關問題。只能查詢咯。(*)

              執行時繫結又稱動態繫結:前提是有繼承、重寫、父類物件指向子類例項, 這樣就產生了多型,在執行時才能知道父類物件指向了哪個子類例項。例如:B b = A a();在執行時才能知道b中存放著A例項a的地址。

              編譯時繫結成靜態繫結:就是在編譯期間就已經載入到了記憶體,包括private、static、final修飾的變數和方法,還有建構函式,都市靜態繫結

 

 

四、是否可以在static環境中訪問非static變數?

      自己解答:

          答案是肯定的,不能,其實前面一題中就可以知道,因為static是跟著類一起載入呢,那時候非static變數還沒載入進記憶體,那麼static就訪問不了非static變數

      

      參考答案:

          static變數在Java中是屬於類的,它在所有的例項中的值是一樣的。當類被Java虛擬機器載入的時候,會對static變數進行初始化。如果你的程式碼嘗試不用例項來訪問非static的變數,編譯器會報錯,因為這些變數還沒有被建立出來,還沒有跟任何例項關聯上。

 

      自我評價:

          這題應該算是理解了。記住static都跟隨類的載入而載入,優先於非static變數。

 

 

五、Java支援的資料型別有哪些?什麼是自動拆裝箱?

      自己解答:

          引用資料型別和非引用資料型別

            非引用資料型別(四類八種):整型:byte、short、int、long、浮點型:float、double、 字元型:char、 布林型:boolean

            引用資料型別:object、String、

          自動裝箱:指的是int -- Integer    double -- Double   到這裡就說不出個所以然來,不熟悉。

 

      參考答案:

          ·基本資料型別:

            整數值型:byte,short,int,long,

            字元型:char

            浮點型別:float,double

            布林型:boolean

            整數預設int型,小數預設是double型。Float和long型別的必須加字尾。
          ·引用資料型別:
            首先知道String是引用型別不是基本型別,引用型別宣告的變數是指該變數在記憶體中實際儲存的是一個引用地址,實體在堆中。引用型別包括類、介面、陣列等。String類還是final修飾的。而包裝類就屬於引用型別,
 
          ·自動裝箱和拆箱就是基本型別和引用型別之間的轉換,至於為什麼要轉換,因為基本型別轉換為引用型別後,就可以new物件,從而呼叫包裝類中封裝好的方法進行基本型別之間的轉換或者toString(當然用類名直接呼叫也可以,便於一眼看出該方法是靜態的),還有就是如果集合中想存放基本型別,泛型的限定型別只能是對應的包裝型別。

 

      自我評價:基本資料型別還是知道,引用型別解釋時應該解釋一下本質。在將自動裝箱時,腦袋裡面只聽過這個名詞,隱約記得以前看過,看是說不出來

           1、基本資料型別:四類八種

           2、引用資料型別:實質就是存放的地址在堆中,而在棧中有指向堆中地址的一個變數名,這樣的就是引用資料型別,String、陣列、集合等都是。

           3、自動裝箱:將int基本資料型別轉換為引用資料型別Integer,int 有包裝類 Integer  double 有包裝類 Double boolean -- Boolean 用的最多就前面兩個,在jdk1.5之後就有自動裝箱的功能了,也就是說不需要我們手動進行,在需要的時候將自動轉換為包裝類來使用包裝類中的一些方法,

           4、為什麼需要包裝類?例如,int想要轉換為String 直接強制轉換會出現問題,所以需要先將int轉換為Integer,然後再toString。。  

           5、什麼時候會自動裝箱?例如1:裝箱比如int變Integer,如果某個地方的引數需要填入Integer,你傳int給它,它自動會生成一個Integer傳過去。反之,Integer變int,就是自動拆箱;例如2:Integer i = 100; 這個時候也完成了自動裝箱,100只是一個int型別的,底層將int自動轉換為了包裝類Integer。

 

           

 

 

 

相關文章