1. 程式人生 > >Java常考面試題(一)

Java常考面試題(一)

div 並且 功能 不出 共享 情況 字符型 對象 java字節碼

      序言

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

                                                                                      ---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。

          

Java常考面試題(一)