Java常見面試題彙總-----------Java基礎(跨平臺、面向對象、重載和覆蓋、訪問修飾符)

1. Java環境配置

  安裝完JDK後配置環境變量:計算機→屬性→高級系統設置→高級→環境變量。
  1、系統變量→新建 JAVA_HOME 變量。變量值填寫jdk的安裝目錄(本人是 D:\Program Java\jdk1.8.0_60);
  2、系統變量→尋找 Path 變量→編輯,在變量值最後輸入 %JAVA_HOME%\bin;%JAVA_HOME%\jre\bin;(注意原來Path的變量值末尾有沒有;號,如果沒有,先輸入;號再輸入上面的代碼);
  3、系統變量→新建 CLASSPATH 變量,變量值填寫:.;%JAVA_HOME%\lib;%JAVA_HOME%\lib\tools.jar(注意最前面有一點)。
  4、系統變量配置完畢,檢驗是否配置成功 運行cmd 輸入 java -version (java 和 -version 之間有空格),顯示版本信息,則說明安裝和配置成功。

2. Java跨平臺的原理

  首先什麼是平臺?
  我們把CPU處理器與操作系統的整體叫平臺。 CPU的種類很多,除去我們熟知的Intel與AMD外,還有比如SUN的Sparc,比如IBM的PowerPC等等,這些各個公司生產的CPU使用或相同或不同的指令集。指令集就是cpu中用來計算和控制計算機系統的一套指令的集合。指令集又分爲精簡指令集(RISC)與複雜指令集(CISC), 每種cpu都有其特定的指令集。開發程序,首先要知道該程序在什麼CPU上運行,也就是要知道CPU所使用的指令集。
  操作系統則是充當用戶和計算機之間交互的界面軟件,不同的操作系統支持不同的CPU,嚴格意義上說是不同的操作系統支持不同CPU的指令集。 例如 windows和liunx都支持Intel和AMD的複雜指令集,但並不支持PowerPC所使用的精簡指令集,而早期的MAC電腦使用的是PowerPC處理器,所以也就無法在MAC下直接安裝windows,直到05年MAC改用了Intel的CPU,才使在MAC下安裝windows成爲可能。但問題來了,原來的MAC 操作系統也只支持PowerPC,在Intel上也不能安裝,怎麼辦?所以蘋果公司也得重寫自己的MAC操作系統以支持這種變化。最後總結下,不同的操作系統支持不同的CPU指令集。
  由於各操作系統支持的指令集,不是完全一致的。就會讓我們的程序在不同的操作系統上要執行不同程序代碼。Java開發了適用於不同操作系統及位數的java虛擬機來屏蔽各系統之間的差異,提供統一的接口。 對於我們java開發者而言,你只需要在不同的系統上安裝對應的不同java虛擬機、這時你的java程序只要遵循java規範,就可以在所有的操作系統上面運行java程序了。

  Java通過不同的系統、不同版本、不同位數的java虛擬機(jvm),來屏蔽不同的系統指令集差異而對外體統統一的接口(java API),對於我們普通的java開發者而言,只需要按照接口開發即可。如果我係統需要部署到不同的環境時,只需在系統上面按照對應版本的虛擬機即可。

  再說下語言根據執行方式的不同分類:第一是編譯執行,如C,它把源程序由特定平臺的編譯器一次性編譯爲平臺相關的機器碼, 它的優點是執行速度快,缺點是無法跨平臺;第二是解釋執行,如HTML,JavaScript,它使用特定的解釋器,把代碼一行行解釋爲機器碼,類似於同聲翻譯,它的優點是可以跨平臺,缺點是執行速度慢,暴露源程序;第三種是從Java開始引入的“中間碼+虛擬機”的方式,它既整合了編譯語言與解釋語言的優點,同時如虛擬機又可以解決如垃圾回收,安全性檢查等這些傳統語言頭疼的問題,所以其後微軟的.NET平臺也使用的這種方式。
  Java先編譯後解釋,同一個.class文件在不同的虛擬機會得到不同的機器指令(Windows和Linux的機器指令不同),但是最終執行的結果卻是相同的。

3. 常見的Java名詞

  EJB:Enterprise Java Bean:Java企業級容器;
  JMS:Java Message Service:Java消息服務,主要實現各個應用程序間的通訊,包括點對點和廣播;
  JTA:Java transaction API:Java事務服務,提供分佈式事務服務(只需要調用接口);
  JAF:Java Action Framwork:Java安全認證框架,提供一些安全控制方面的框架;
  JNDI:Java Naming & Directory Interface:Java命名目錄服務;
  RMI:Remote method Invocation/Internet:對象請求中介協議,主要用於通過遠程調用服務。
  常用工具:
  Javac.exe:編譯源文件(可以沒有main方法);
  Java.exe:運行class文件,必須要有main方法入口;
  J2SDK是編譯工具,而不是API;
  Appretriewer.exe:用來解釋執行java applet應用程序(沒有main函數)。
  DOC下的一些命令:
  Java –version:查看Java開發工具JDK版本;
  Javac Test.java(Java源文件):編譯Java源文件,生成字節碼文件Test.class;
  Java Test.class(後綴名.class可以省略);
  Javac去編譯一個含有package語句的java文件要帶參數:javac –d . Java文件名。

4. 面向對象編程的特徵

  封裝
  封裝是保證軟件部件具有優良的模塊性的基礎,封裝的目標就是要實現軟件部件的“高內聚、低耦合”,防止程序相互依賴性而帶來的變動影響。在面向對象的編程語言中,對象是封裝的最基本單位,面向對象的封裝比傳統語言的封裝更爲清晰、更爲有力。面向對象的封裝就是把描述一個對象的屬性和行爲的代碼封裝在一個“模塊”中,也就是一個類中,屬性用變量定義,行爲用方法進行定義,方法可以直接訪問同一個對象中的屬性。把握一個原則:把對同一事物進行操作的方法和相關的方法放在同一個類中,把方法和它操作的數據放在同一個類中。
  例如,人要在黑板上畫圓,這一共涉及三個對象:人、黑板、圓,畫圓的方法要分配給哪個對象呢?由於畫圓需要使用到圓心和半徑,圓心和半徑顯然是圓的屬性,如果將它們在類中定義成了私有的成員變量,那麼,畫圓的方法必須分配給圓,它才能訪問到圓心和半徑這兩個屬性,人以後只是調用圓的畫圓方法、表示給圓發給消息而已,畫圓這個方法不應該分配在人這個對象上,這就是面向對象的封裝性,即將對象封裝成一個高度自治和相對封閉的個體,對象狀態(屬性)由這個對象自己的行爲(方法)來讀取和改變。

  繼承(extend)
  1、在定義和實現一個類的時候,可以在一個已經存在的類的基礎之上來進行,把這個已經存在的類所定義的內容作爲自己的內容,並可以加入若干新的內容,或修改原來的方法使之更適合特殊的需要,這就是繼承。繼承是子類自動共享父類數據和方法的機制,這是類之間的一種關係,提高了軟件的可重用性和可擴展性。
  2、子類最多隻能繼承一個父類。
  3、Java所有類都是Object類的子類。
  4、構造方法不能被繼承,構造方法只能被顯式或隱式調用, 如果希望在子類中調用父類的構造方法,要求在子類的構造函數中調用super()方法。且必需放在子類構造函數的第一行。
  5、JDK6中有202個包3777個類、接口、異常、枚舉、註釋和錯誤。
  注意幾點:
  1、在一個子類繼承的時候,實際上會繼承父類之中的所有操作(屬性、方法),但是需要注意的是,對於所有的非私有(no private)操作屬於顯式繼承(可以直接利用對象操作),而所有的私有操作屬於隱式繼承(間接完成)。
  2、在繼承關係之中,如果要實例化子類對象,總是會先調用父類的構造方法,如果子類沒有顯式地指明使用父類的哪個構造方法,子類則默認調用無參構造方法。(此時若父類自定義了構造方法,則沒有無參構造方法,會報錯)。
  3、關於類加載過程中代碼塊的執行順序,首先是靜態代碼塊,是最先執行的,且只在加載的時候執行一次。構造代碼塊在每次new對象的時候於構造方法執行之前執行,即每次調用構造方法都執行。即首先執行靜態代碼塊、接着執行構造代碼塊(非靜態代碼塊)、最後執行構造方法。
  在實現繼承的類被new的過程中,初始化執行順序如下:1、實現父類的公共靜態屬性和靜態塊級代碼。2、實現自身的靜態屬性和靜態塊級代碼。3、實現父類的非靜態屬性和非靜態代碼塊。4、執行父類的構造函數。5、實現自身的非靜態屬性和非靜態代碼塊。6、執行自身的構造函數。

  多態
  所謂多態就是指一個引用(類型)在不同情況下的多種狀態。也可以這樣理解:多態是通過指向父類的指針,來調用在不同子類中實現的方法。
  引用變量所指向的具體類型和通過該引用變量發出的方法調用在編程時並不確定,而是在程序運行期間才確定,即一個引用變量到底會指向哪個類的實例對象,該引用變量發出的方法調用到底是哪個類中實現的方法,必須在由程序運行期間才能決定。因爲在程序運行時才確定具體的類,這樣,不用修改源程序代碼,就可以讓引用變量綁定到各種不同的類實現上,從而導致該引用調用的具體方法隨之改變,即不修改程序代碼就可以改變程序運行時所綁定的具體代碼,讓程序可以選擇多個運行狀態,這就是多態性。多態性增強了軟件的靈活性和擴展性。
  1、Java允許父類的引用變量引用它的子類的實例(對象)。這種轉化是自動完成的。
  2、java實現多態的機制靠的是父類或接口定義的引用變量可以指向子類或具體實現類的實例對象,而程序調用的方法在運行期才動態綁定,就是引用變量所指向的具體實例對象的方法,也就是內存里正在運行的那個對象的方法,而不是引用變量的類型中定義的方法。

5. Java重載和覆蓋

  重載(overload)
  1、簡單的說:方法重載就是類的同一種功能的多種實現方式,到底採用哪種方式,取決於調用者給出的參數。
  2、方法名相同。方法的參數類型,個數,順序至少有一項不同。
  3、不能通過訪問權限、返回類型、拋出的異常進行重載;
  4、方法返回類型可以不同。但是隻是返回類型不一樣,不能夠構成重載。我們可以用反證法來說明這個問題,因爲我們有時候調用一個方法時也可以不定義返回結果變量,即不要關心其返回結果,例如,我們調用map.remove(key)方法時,雖然remove方法有返回值,但是我們通常都不會定義接收返回結果的變量,這時候假設該類中有兩個名稱和參數列表完全相同的方法,僅僅是返回類型不同,java就無法確定編程者到底是想調用哪個方法了,因爲它無法通過返回結果類型來判斷。

  覆蓋(override)
  簡單的說:方法覆蓋就是子類有一個方法,和父類的某個方法的名稱,返回類型,參數一樣,那麼我們就說子類的這個方法覆蓋了父類的那個方法。
  1、子類的方法的返回類型,參數,方法名稱,要和父類方法的返回類型,參數,方法名稱完全一樣,否則會編譯出錯。
  2、子類方法不能縮小父類方法的訪問權限。子類方法的訪問權限只能比父類的更大,不能更小。如果父類的方法是private類型,那麼,子類則不存在覆蓋的限制,相當於子類中增加了一個全新的方法。
  3、子類覆蓋父類的方法時,只能比父類拋出更少的異常,或者是拋出父類拋出的異常的子異常,因爲子類可以解決父類的一些問題,不能比父類有更多的問題。

6. Java訪問修飾符

  java中4中修飾符分別爲public、protected、default、private,他們這就說明了面向對象的封裝性,所以我們要適用他們儘可能的讓權限降到最低,從而安全性提高。

  private修飾的屬性或方法爲該類所特有,在任何其他類中都不能直接訪問;
  default修飾的屬性或方法具有包訪問特性,同一個包中的其他類可以訪問;
  protected修飾的屬性或方法在同一個包中的其他類可以訪問,同時對於不在同一個包中的子類中也可以訪問;(因此也不能說protected修飾的屬性與方法,在其他包中絕對訪問不到,只要是它的子類就可以)。
  public修飾的屬性或方法外部類中都可以直接訪問。

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