【計題04組01號】Java面試問答題
- 2022 年 3 月 8 日
- 筆記
寫作前面
本書內容摘自《Java程式設計師面試筆試寶典》
很多同學在面試時其實有個誤區,認為準備的東西越詳細越好
其實不是,就和批試卷一樣,寫長篇大論其實並不會必然加分
老師閱卷時間有限只會抓關鍵詞,面試官也是一樣的道理
加上面試官每天面試的人有很多,不可能在你身上浪費大量的時間,更不可能有時間聽你背書
工作不是要一個背書機器,加上電腦語言晦澀難懂,要想把整本書背下來基本不可能
那麼為什麼有時候我們聽大佬說話句句都是重點
因為他拋棄了所有的贅述,只留下了關鍵詞和框架
但是這本書怎麼說呢,回答問題的邏輯稍微有點亂,有時候看著看著就把問題忘了,所以有些拓展內容就刪掉了,留到別的頁面去單獨和大家討論
面試的時候除非面試官追問,否則一般兩三句話可以搞定了
所以這篇博文的回答都會很短,但是不是直接靠這個回答就可以了,大家要根據關鍵詞將語言用自己的話組織起來
Java基礎知識
Java語言有哪些優點
純面向對象,平台無關,有內置類,支援Web應用開發,安全和健壯,規避了C++的弊端
Java和C++有什麼區別和相同
Java編譯成位元組碼JVM解釋,C++經過編譯生成二進位程式碼
Java純面向對象,C++兼具面向對象過程
Java沒有指針更安全
Java不支援多重繼承
Java自帶回收功能
Java語言不支援運算符重載,C++支援
Java和平台無關,C++有關
Java提供對注釋文檔內建支援
Java包含了標準庫
為什麼需要public static void main (String[] args) 這個方法
main是JVM識別的特殊方法名,是程式的入口方法
如何實現在Main方法執行前輸出hello world
main方法不一定是第一個被執行的,在前面利用靜態塊實現輸出語句
Java程式初始化的順序是怎麼樣的
靜態對象優於非靜態對象
父類優於子類
按照成員變數定義順序
Java中的作用域有哪些
Java的變數有三種:成員變數,靜態變數【全局變數】,局部變數
成員變數還有四種:public,private,protected,default
一個Java文件中是否可以定義多個類
可以定義,但只有一個類被public修飾,且必須與文件名相同,沒有public類文件名隨便一個類的名字
什麼是構造函數
用來在對象實例化時初始化對象的成員變數的函數
- 構造函數必須與類的名字相同
- 每個類可以有多個構造函數
- 參數不限制
- 總是伴隨著new操作一起調用,且不能直接調用,必須系統調用
- 主要作用完成初始化工作
- 不能被繼承
- 子類可以通過super來調用父類構造函數
- 父類和子類都沒有定義,編譯器自動為兩個類生成無參數構造函數
為什麼Java中有些介面沒有任何方法
Java不支援多重繼承,Java一個類可以實現多個介面,間接達到多重介面的目的
Java中的clone方法有什麼作用
為了解決引用傳遞中,修改一個值會影響到另一個值的問題
什麼是反射機制
允許程式運行時自我檢查,增加程式的靈活性
功能主要有
- 得到一個對象所屬的類
- 獲取一個類的所有成員變數和方法
- 在運行時創建對象
- 在運行時調用對象的方法
package有什麼作用
- 解決明明衝突
- 對類按照功能分類,項目組織更加清晰
如何實現類似於C語言中函數指針的功能
定義一個介面,在介面中生命調用的方法,實現這個介面,最後把實現類的一個對象作為參數傳遞給調用程式
面向對象和面向過程有什麼區別
出發點不同:前者用常規思維的方式處理問題,後者強調過程的抽象化與模組化
層次邏輯關係不同:前者用電腦邏輯來模擬客觀世界,後者把客觀世界的問題抽象成電腦可以處理的過程
數據處理方式與控制程式方式不同:前者將對應的程式碼封裝成一個整體,後者是直接通過程式來處理數據處理完畢即可顯示結果
分析設計與編碼轉換方式不同:前者從分析、設計到編碼採用一致性模型,後者從分析、設計到編碼之間按規則進行轉換
面向對象有哪些特徵
抽象、繼承、封裝、多態
採用面向對象的開發方式有什麼特點
較高的開發效率
保證軟體的魯棒性
保證軟體的高可維護性
什麼是繼承
子類適用父類的一些成員變數與方法,提高程式碼的復用性,提高開發效率
組合和繼承有什麼區別
組合相當於【Has】
繼承相當於【Is】,在這種情況下才使用繼承
多態的實現機制是什麼
多態是指同一個操作對於不同的對象,會有不同的語義
有兩種表現方式
方法的重載【同名方法,不同參數】
方法的覆蓋【子類覆蓋父類】
重載和覆蓋有什麼區別
重載是同一個類中的方法之間的關係,覆蓋是父類和子類的關係
覆蓋只能一個方法或者一對方法產生關係,重載是多個方法之間的關係
覆蓋參數列表相同,重載參數列表不同
覆蓋調用根據對象的類型,重載調用根據實參和形參的方法體
抽象類和介面有什麼異同
相同點
- 都不能被實例化
- 只有實現了其中的方法才能被實例化
不同點
- 介面只有定義,只有實現介面的類才能實現介面中定義的方法,抽象類可以有定義和實現,其方法可以再抽象類中被實現
- 介面需要實現【implements】,但抽象類只能被繼承【entends】,一個類可以實現多個介面,但一個類只能繼承一個抽象類
- 介面理念是has關係,抽象類是is關係
- 介面中定義的成員變數默認為public static final,抽象類可以有自己的數據成員變數,也可以由非抽象的成員方法
- 介面被運用與實現比較常用的功能,抽象類更傾向於充當公共類的角色
介面是一種特殊形式的抽象類,但抽象類多用於同類食物中無法具體描述的方法的場景,僅限於子類和父類有邏輯關係才使用
內部類有哪些
靜態內部類,成員內部類,局部內部類,匿名內部類
如何獲取父類的類名
getClass().getSuperclass().getName()
this與super有什麼區別
this用來指向當前實例對象,super用來訪問父類
變數命名有哪些規則
只能由字母,數字,下劃線和美元符號組成,第一個字元不能是數字,標識符不能包含空白字元
break,continue以及return有什麼區別
break直接結束當前循環
continue結束此次循環,進入下一次循環
return是一個跳轉語句,是的程式返回到調用該方法的地方
final,finally和finallize有什麼區別
final聲明屬性、方法和類
finally是異常處理一部分
finalize是覆蓋此方法來實現對其他資源的回收
assert有什麼作用
對bollean表達式進行檢查,用來保證程式的正確性,在開發和測試使用
static關鍵字有哪些作用
為某特定數據類型或對象分類單一的存儲空間,預創建對象個數無關
實現某個方法或屬性與類而不是對象關聯在一起
適用switch時有哪些注意事項
switch表達式只能是int
省略了break,匹配語句後面所有的情況包括default都會被執行
volatile有什麼作用
修飾被不同執行緒訪問和修改的變數,系統直接從對應記憶體提取,不會利用快取
instanceof有什麼作用
判斷一個引用類型的變數所指向的對象是否是一個類的實例,即它左邊的對象是否是它右邊的類的實例【boolean類型】
strictfp有什麼作用
全稱strict float point,指的是精確浮點,確保浮點數運算
Java提供了哪些基本數據類型
8種,byte,short,int,long,float,double,char,boolean
什麼是不可變類
創建類的實例後,不允許修改它的值,類似於const,一般情況下封裝類都是不可變類,包括String
創建不可邊類的原則
- 成員變數private修飾
- 一般沒有set方法
- 確保類中所有方法不會被子類覆蓋
- 如果一個類成員不是不可變數,需要通過clone方法來保證
- 如果有必要,可以使用equals方法和hashCode方法
值傳遞與引用傳遞有哪些區別
值傳遞形參的改變不會影響實參的值,引用傳遞形參的修改就會影響實參的值
不同數據類型的轉換有哪些規則
類型自動轉換,強制類型轉換
強制類型轉換注意事項有哪些
涉及byte、short和char類型的運算,會強制轉換為int
需要得到short類型的結果,需要顯示地轉換
運算符優先順序是什麼

Math類中round、ceil和floor方法的功能各是什麼
round方法表示四捨五入
ceil方法表示向上取整
floor方法表示向下取整
++i與i++有什麼區別
前者程式開始前自增,後者程式執行完畢後自增
如何實現無符號數的右移運算
>>被稱為有符號右移運算【為正數高位補0,負數時高位補1】
>>>被稱為無符號右移運算【執行運算時,都會在高位補0】
char型變數中是否可以存儲一個中文漢字
可以,不過,如果某個特殊的漢字沒有被包含在unicode編碼字符集中,那麼,這個char型變數中就不能存儲這個特殊漢字
字元串創建與存儲的機制是什麼
①創建對象
String s1 = new String("abc");
String s2 = new String("abc");
②聲明對象
String s1 = "abc";
String s2 = "abc";
==、equals和hashCode有什麼區別
==用來比較兩個變數的值是否相等
equals在沒有被覆蓋的情況下和==運算符一樣,覆蓋以後可以比較數據內容而不是引用
hashCode用來鑒定兩個對象是否相等,返回對象地址是否相等
equals方法用於比較對象的內容是否相等(覆蓋以後)
hashcode方法只有在集合中用到
當覆蓋了equals方法時,比較對象是否相等將通過覆蓋後的equals方法進行比較(判斷對象的內容是否相等)。
將對象放入到集合中時,首先判斷要放入對象的hashcode值與集合中的任意一個元素的hashcode值是否相等,如果不相等直接將該對象放入集合中。如果hashcode值相等,然後再通過equals方法判斷要放入對象與集合中的任意一個對象是否相等,如果equals判斷不相等,直接將該元素放入到集合中,否則不放入。
String、StringBuffer、StringBuilder和StringTokenizer有什麼區別
1)String、StringBuffer、StringBuilder都用於字元串操作,其中,String是不可變類,即String對象一旦被創建,其值不能被修改,而StringBuffer和StringBuilder都是可變類,對象被創建以後仍然可以對其值進行修改。
2)在字元串需要共享的場合中使用String合適,而當一個字元串經常需要被修改時,最好使用StringBuffer或者StringBuilder,具體看是否多執行緒
3)String類實例化對象有兩種方式:可以利用構造方法的方式(String str = new String("Hello"))來進行初始化,也可以用賦值的方式(String str = 「Hello」)進行初始化。而StringBuffer和StringBuilder只能通過構造方法的方式(StringBuffer sb = new StringBuffer(「Hello」))來初始化。
4)StringBuffer是執行緒安全的,StringBuilder不是執行緒安全的。
5)在執行效率方面,StringBuilder最高,StringBuffer次之,String最低。一般而言,如果要操作的數據量比較小,應優先使用String;如果在單執行緒下操作大量數據,應優先選擇StringBuilder;如果是在多執行緒下操作大量數據,應優先考慮StringBuffer
6)StringTokenizer是用來分割字元串的工具類。
Java中數組是不是對象
對象的特點是封裝了一些數據,同時提供一些屬性和方法,所以數組是對象
有自己的屬性【如何length】,也有一些方法被調用【clone】
數組的初始化方式有哪幾種
一維數組兩種
type arrayName[ ]或者type[ ]arrayName
二維數組三種
type arrayName[ ][ ] ;
type[ ][ ] arrayName;
type[ ] arrayName[ ];
length屬性與length()方法有什麼區別
前一個是數組長度,後一個是字元串長度
return後的finally塊中的程式碼什麼時候被執行
一定會執行,並且在return前執行
異常處理的原理是什麼
把異常當做對象來處理,並定義了一個基類java.lang.Throwable作為所有異常的父類
運行時異常和普通異常有什麼區別
一般異常表示程式運行過程中可能出現的非正常狀態,運行時異常表示虛擬機的通常操作中可能遇到的異常,是一種常見的運行錯誤
java編譯器要求方法聲明拋出可能發生的非運行時異常,但是並不要求必須聲明拋出未捕獲運行時異常。
Java IO流的實現機制是什麼
輸入和輸出都被稱為抽象的流,流可以被看做一組有序的位元組集合,即數據在兩設備之間的傳輸
流可以分為兩大類:位元組流和字元流
管理文件和目錄的類是什麼
File類管理文件和文件夾,通過類不僅能夠查看文件或目錄的屬性,而且還可以實現對文件或目錄的創建、刪除與重命名等操作。
Java Web
頁面請求的工作流程是怎樣的
- 用戶輸入網址
- 把用戶請求發送給伺服器
- 伺服器查找請求的網頁
- 找到用戶請求的頁面
- 發送相應消息
- 瀏覽器顯示返回結果
HTTP中GET語POST方法有什麼區別
GET是一種最簡單的請求方法,其主要功能是從伺服器端獲取用戶所需資源,並將其作為相應返回給客戶端
GET方法的作用主要用來獲取伺服器端資源資訊,不會影響到資源自身的狀態
POST方法在這個基礎上還可以向伺服器上傳數據
什麼是Servlet
Servlet 是採用Java語言編寫的伺服器端程式,它運行於Web伺服器中的Servlet容器中,其主要功能是提供請求/響應的Web服務模式,可以生成動態的Web內容,而這正是HTML所不具備的功能。
與其他生成動態頁面技術相比,Servlet有諸多優點
- 較好的可移植性
- 執行效率高
- 功能強大【可以與Web伺服器進行交互】
- 使用方便【有介面用來讀取或者設置HTTP都消息,處理Cookie和跟蹤會話狀態】
- 可擴展性強【具備Java所有優點】
什麼是Servlet的生命周期
載入、創建、初始化、處理客戶請求、卸載
載入:容器通過類載入器使用Servlet類對應的文件來載入Servlet
創建:通過調用Servlet的構造函數來創建一個Servlet實例。
初始化:通過調用Servlet 的init( )方法來完成初始化工作
處理客戶請求:Servlet 一旦被創建後,它就可以為客戶端提供服務了。
卸載:容器在卸載Servlet之前需要調用destroy()方法,讓Servlet自己釋放其佔用的系統資源
JSP有哪些優點
JSP的引入在一定程度上解決了Servlet存在的缺點
改進了Web應用程式程式碼可讀性差,系統可擴展性可維護性差的缺陷
JSP與Servlet有何異同
相同點
JSP可以看做特殊的Servlet,只要是JSP可以完成的工作,Servlet都可以完成
不同點
Servlet是在Java嵌入HTML程式碼,編寫不方便,JSP實現是在HTML中嵌入Java程式碼
Servlet中沒有內置對象
JSP中的內置對象都是通過HttpServletRequest對象、HttpServletResponse 對象以及HttpServlet對象得到。
如何使用JSP與Servlet實現MVC模型
MVC全程Model【模型】,View【視圖】、Controller【控制器】首字母組合
MVC強制性地分離Web應用的輸入、處理和輸出,使得MVC應用程式分成3個核心部件

JSP的內置對象有哪些
在JSP中,內置對象又稱為隱含對象,是指在不聲明和不創建的情況下就可以被使用的一些成員變數。
JSP一共提供有9個內置對象:
request ( 請求對象)
response (響應對象)
pageContext(頁面上下文對象)
session ( 會話對象)
application (應用程式對象)
out (輸出對象)
config(配置對象)
page (頁面對象)
exception (例外對象)
request對象主要有哪些方法

JSP有哪些動作
|
jsp: include。用來在頁面被請求時引入一個文件。 |
![]() |
|
jsp : useBean。用來尋找或者實例化一個JavaBean。 |
![]() |
|
jsp: setProperty。用來設置已經實例化的Bean對象的屬性 |
![]() |
|
jsp : getProperty。用來獲取某個JavaBean的屬性 |
![]() |
|
jsp:foward。用來把請求轉到一個新頁面 |
![]() |
|
jsp: plugin。用於在瀏覽器中播放或顯示一個對象 |
![]() |






