最新Java基礎面試題及答案整理

最近在備戰面試的過程當中,整理一下面試題。大多數題目都是本身手敲的,網上也有不少這樣的總結。本身感受老是很亂,因此花了好久把本身以爲重要的東西總結了一下。html

面向對象和麪向過程的區別

面向過程:   java

優勢:性能比面向對象高,由於類調用時須要實例化,開銷比較大,比較消耗資源;好比單片機、嵌入式開發、Linux/Unix等通常採用面向過程開發,性能是最重要的因素。面試

缺點:沒有面向對象易維護、易複用、易擴展編程

面向對象:   小程序

優勢:易維護、易複用、易擴展,因爲面向對象有封裝、繼承、多態性的特性,能夠設計出低耦合的系統,使系統更加靈活、更加易於維護數組

缺點:性能比面向過程低瀏覽器

Java語言有哪些特色?

1. 簡單易學;安全

2. 面向對象(封裝,繼承,多態);微信

3. 平臺無關性(Java虛擬機實現平臺無關性);網絡

4. 可靠性;

5. 安全性;

6. 支持多線程(C++語言沒有內置的多線程機制,所以必須調用操做系統的多線程功能來進行多線程程序設計,而Java語言卻提供了多線程支持);

7. 支持網絡編程而且很方便(Java語言誕生自己就是爲簡化網絡編程設計的,所以Java語言不只支持網絡編程並且很方便);

8. 編譯與解釋並存;

什麼是字節碼?採用字節碼的最大好處是什麼?什麼Java是虛擬機?

先看下java中的編譯器和解釋器:   

Java中引入了虛擬機的概念,即在機器和編譯程序之間加入了一層抽象的虛擬的機器。這臺虛擬的機器在任何平臺上都提供給編譯程序一個的共同的接口。編譯程序只須要面向虛擬機,生成虛擬機可以理解的代碼,而後由解釋器來將虛擬機代碼轉換爲特定系統的機器碼執行。在Java中,這種供虛擬機理解的代碼叫作字節碼(即擴展名爲.class的文件),它不面向任何特定的處理器,只面向虛擬機。每一種平臺的解釋器是不一樣的,可是實現的虛擬機是相同的。Java源程序通過編譯器編譯後變成字節碼,字節碼由虛擬機解釋執行,虛擬機將每一條要執行的字節碼送給解釋器,解釋器將其翻譯成特定機器上的機器碼,而後在特定的機器上運行,這就是上面提到的Java的特色的編譯與解釋並存的解釋。 Java源代碼---->編譯器---->jvm可執行的Java字節碼(即虛擬指令)---->jvm---->jvm中解釋器----->機器可執行的二進制機器碼---->程序運行。

採用字節碼的好處:   

Java語言經過字節碼的方式,在必定程度上解決了傳統解釋型語言執行效率低的問題,同時又保留了解釋型語言可移植的特色。因此Java程序運行時比較高效,並且,因爲字節碼並不專對一種特定的機器,所以,Java程序無須從新編譯即可在多種不一樣的計算機上運行。

什麼是Java虛擬機:

任何一種能夠運行Java字節碼的軟件都可當作是Java的虛擬機(JVM)

什麼是Java程序的主類?應用程序和小程序的主類有何不一樣?

一個程序中能夠有多個類,但只能有一個類是主類。在Java應用程序中,這個主類是指包含main()方法的類。而在Java小程序中,這個主類是一個繼承自系統類JApplet或Applet的子類。應用程序的主類不必定要求是public類,但小程序的主類要求必須是public類。主類是Java程序執行的入口點。

什麼是JDK?什麼是JRE?

JDK: 顧名思義它是給開發者提供的開發工具箱,是給程序開發者用的。它除了包括完整的JRE(Java Runtime Environment),Java運行環境,還包含了其餘供開發者使用的工具包。

JDK

 

JRE:普通用戶而只須要安裝JRE(Java Runtime Environment)來 來運行Java程序。而程序開發者必須安裝JDK來編譯、調試程序。

環境變量Path和ClassPath的做用是什麼?如何設置這兩個環境變量?

Java環境變量PATH和CLASSPATH - 簡書 http://www.jianshu.com/p/d63b099cf283

Java應用程序與小程序之間有那些差異?

簡單說應用程序是從主線程啓動(也就是main()方法)。applet小程序沒有main方法,主要是嵌在瀏覽器頁面上運行(調用init()線程或者run()來啓動),嵌入瀏覽器這點跟flash的小遊戲相似。

字符型常量和字符串常量的區別

  1. 形式上: 字符常量是單引號引發的一個字符 字符串常量是雙引號引發的若干個字符
  2. 含義上: 字符常量至關於一個整形值(ASCII值),能夠參加表達式運算 字符串常量表明一個地址值(該字符串在內存中存放位置)
  3. 佔內存大小 字符常量只佔一個字節 字符串常量佔若干個字節(至少一個字符結束標誌)

Java語言採用何種編碼方案?有何特色?

Java語言採用Unicode編碼標準,Unicode(標準碼),它爲每一個字符制訂了一個惟一的數值,所以在任何的語言,平臺,程序均可以放心的使用。

構造器Constructor是否可被override

在講繼承的時候咱們就知道父類的私有屬性和構造方法並不能被繼承,因此Constructor也就不能被override,可是能夠overload,因此你能夠看到一個類中有多個構造函數的狀況。

重載和重寫的區別

重載:發生在同一個類中,方法名必須相同,參數類型不一樣、個數不一樣、順序不一樣,方法返回值和訪問修飾符能夠不一樣,發生在編譯時。   

重寫:發生在父子類中,方法名、參數列表必須相同,返回值小於等於父類,拋出的異常小於等於父類,訪問修飾符大於等於父類;若是父類方法訪問修飾符爲private則子類中就不是重寫。

java 面向對象編程三大特性------封裝、繼承、多態

blog.csdn.net/jianyuerens…

java中equals方法的用法以及==的用法

www.cnblogs.com/bluestorm/a…

String和StringBuffer、StringBuilder的區別是什麼?String爲何是不可變的?

可變性

String類中使用字符數組保存字符串,private final char value[],因此string對象是不可變的。StringBuilder與StringBuffer都繼承自AbstractStringBuilder類,在AbstractStringBuilder中也是使用字符數組保存字符串,char[]value,這兩種對象都是可變的。   

線程安全性

String中的對象是不可變的,也就能夠理解爲常量,線程安全。AbstractStringBuilder是StringBuilder與StringBuffer的公共父類,定義了一些字符串的基本操做,如expandCapacity、append、insert、indexOf等公共方法。StringBuffer對方法加了同步鎖或者對調用的方法加了同步鎖,因此是線程安全的。StringBuilder並無對方法進行加同步鎖,因此是非線程安全的。   

性能

每次對String 類型進行改變的時候,都會生成一個新的String對象,而後將指針指向新的String 對象。StringBuffer每次都會對StringBuffer對象自己進行操做,而不是生成新的對象並改變對象引用。相同狀況下使用StirngBuilder 相比使用StringBuffer 僅能得到10%~15% 左右的性能提高,但卻要冒多線程不安全的風險。 對於三者使用的總結: 若是要操做少許的數據用 = String 單線程操做字符串緩衝區 下操做大量數據 = StringBuilder 多線程操做字符串緩衝區 下操做大量數據 = StringBuffer

自動裝箱與拆箱

裝箱:將基本類型用它們對應的引用類型包裝起來;

拆箱:將包裝類型轉換爲基本數據類型;   

Java使用自動裝箱和拆箱機制,節省了經常使用數值的內存開銷和建立對象的開銷,提升了效率,由編譯器來完成,編譯器會在編譯期根據語法決定是否進行裝箱和拆箱動做。

類、方法、成員變量和局部變量的可用修飾符 -

blog.csdn.net/yttcjj/arti…

在一個靜態方法內調用一個非靜態成員爲何是非法的?

因爲靜態方法能夠不經過對象進行調用,所以在靜態方法裏,不能調用其餘非靜態變量,也不能夠訪問非靜態變量成員。

在Java中定義一個不作事且沒有參數的構造方法的做用

Java程序在執行子類的構造方法以前,若是沒有用super()來調用父類特定的構造方法,則會調用父類中「沒有參數的構造方法」。所以,若是父類中只定義了有參數的構造方法,而在子類的構造方法中又沒有用super()來調用父類中特定的構造方法,則編譯時將發生錯誤,由於Java程序在父類中找不到沒有參數的構造方法可供執行。解決辦法是在父類里加上一個不作事且沒有參數的構造方法。

import java和javax有什麼區別

www.cnblogs.com/EasonJim/p/…

接口和抽象類的區別是什麼?

1.接口的方法默認是public,全部方法在接口中不能有實現,抽象類能夠有非抽象的方法 2.接口中的實例變量默認是final類型的,而抽象類中則不必定 3.一個類能夠實現多個接口,但最多隻能實現一個抽象類 4.一個類實現接口的話要實現接口的全部方法,而抽象類不必定 5.接口不能用new實例化,但能夠聲明,可是必須引用一個實現該接口的對象 從設計層面來講,抽象是對類的抽象,是一種模板設計,接口是行爲的抽象,是一種行爲的規範。

成員變量與局部變量的區別有那些?

  1. 從語法形式上,當作員變量是屬於類的,而局部變量是在方法中定義的變量或是方法的參數;成員變量能夠被public,private,static等修飾符所修飾,而局部變量不能被訪問控制修飾符及static所修飾;成員變量和局部變量都能被final所修飾;
  2. 從變量在內存中的存儲方式來看,成員變量是對象的一部分,而對象存在於堆內存,局部變量存在於棧內存
  3. 從變量在內存中的生存時間上看,成員變量是對象的一部分,它隨着對象的建立而存在,而局部變量隨着方法的調用而自動消失。
  4. 成員變量若是沒有被賦初值,則會自動以類型的默認值而賦值(一種狀況例外被final修飾但沒有被static修飾的成員變量必須顯示地賦值);而局部變量則不會自動賦值。

建立一個對象用什麼運算符?對象實體與對象引用有何不一樣?

new運算符,new建立對象實例(對象實例在堆內存中),對象引用指向對象實例(對象引用存放在棧內存中)。一個對象引用能夠指向0個或1個對象(一根繩子能夠不繫氣球,也能夠系一個氣球);一個對象能夠有n個引用指向它(能夠用n條繩子繫住一個氣球)

什麼是方法的返回值?返回值在類的方法裏的做用是什麼?

方法的返回值是指咱們獲取到的某個方法體中的代碼執行後產生的結果!(前提是該方法可能產生結果)。返回值的做用:接收出結果,使得它能夠用於其餘的操做!

一個類的構造方法的做用是什麼?若一個類沒有聲明構造方法,改程序能正確執行嗎?爲何?

主要做用是完成對類對象的初始化工做。能夠執行。由於一個類即便沒有聲明構造方法也會有默認的不帶參數的構造方法。

構造方法有哪些特性?

1. 名字與類名相同;

2. 沒有返回值,但不能用void聲明構造函數;

3. 生成類的對象時自動執行,無需調用。

靜態方法和實例方法有何不一樣?

靜態方法和實例方法的區別主要體如今兩個方面:

  1. 在外部調用靜態方法時,可使用"類名.方法名"的方式,也可使用"對象名.方法名"的方式。而實例方法只有後面這種方式。也就是說,調用靜態方法能夠無需建立對象。
  2. 靜態方法在訪問本類的成員時,只容許訪問靜態成員(即靜態成員變量和靜態方法),而不容許訪問實例成員變量和實例方法;實例方法則無此限制

對象的相等與指向他們的引用相等,二者有什麼不一樣?

對象的相等 比的是內存中存放的內容是否相等而 引用相等 比較的是他們指向的內存地址是否相等。

在調用子類構造方法以前會先調用父類沒有參數的構造方法,其目的是?

幫助子類作初始化工做。

什麼是多態機制?Java語言是如何實現多態的?

blog.csdn.net/bornlili/ar…

equals 和 == 的區別?

通俗點講:==是看看左右是否是一個東西。equals是看看左右是否是長得同樣。如何記住嘛。若是單純是想記住,==:等於。equals:相同。兩個長得同樣的人,只能說長的相同(equals),可是不等於他們倆是一我的。你只要記住equals,==就不用記了。

術語來說的區別:

1. ==是判斷兩個變量或實例是否是指向同一個內存空間 equals是判斷兩個變量或實例所指向的內存空間的值是否是相同

2. ==是指對內存地址進行比較 equals()是對字符串的內容進行比較

3. ==指引用是否相同 equals()指的是值是否相同。

我有一個微信公衆號,常常會分享一些Java技術相關的乾貨;

若是你喜歡個人分享,能夠用微信搜索「Java團長」或者「javatuanzhang」關注。

相關文章
相關標籤/搜索