1.面向對象和麪向過程有什麼區別?
面向過程:面向過程的效率要高於面向對象,因爲類的調用需要實例化,資源開銷比較大,一般當性能是最重要的指標的時候會採用面向過程的方式進行開發,比如單片機、嵌入式開發等。
面向對象:面向對象易維護、易複用、易擴展。因爲面向對象有封裝、繼承、多態的特性,所以更加方便設計出低耦合、靈活的系統,更加方便維護,面向對象的性能要低於面向過程。
追問:面向過程的性能比面向對象低?
面向過程也需要分配內存,計算內存偏移量。Java是面向對象的代表語音,Java是一個半編譯語言,最終的執行並不是直接可以被CPU執行的二進制機器碼,而面向過程語音大多都是直接編譯成機器碼在電腦上執行,但是一些面向過程的腳本語言性能不一定就比Java好。
2.Java與C++有什麼區別?(有很多人都不會C++,但是這個問題有面試官就喜歡問,就這幾點,背下吧!)
- 都是面嚮對象語言,都支持封裝、繼承、多態。
- Java不提供指針直接訪問內存,程序內存更加安全。
- Java類是單繼承的,C++可以多繼承,雖然Java的類不可以多繼承,但是Java的接口可以多繼承。
- Java有自動的內存管理機制,不需要開發人員收懂釋放無用內存。
- 在C語言中,字符串或者字符數組都會有一個“\0”作爲結束符,Java中沒有這個概念。
3.什麼是Java程序的主類?應用程序和小程序的主類有什麼不同?Java應用程序與小程序之間有哪些差別?
問題1&問題2:一個程序可以有多個類,但是主類只能有一個。在Java應用程序中這個主類就是指包含main()方法的類。而在Java小程序中這個主類是一個繼承自系統類JApplet活Applet的子類。應用程序的入口類不一定要求是public修飾的,但是小程序的入口必須是public修飾的。主類是程序執行的入口。
問題3:應用程序是從主線程啓動的,也就是main()方法,applet小程序沒有main()方法,主要是鑲嵌在瀏覽器上面運行的(調用init()或者run()方法來啓動),嵌入瀏覽器這點跟flash小遊戲有點相似。
4.什麼是自動拆箱?什麼是自動裝箱?
拆箱:將包裝類轉換爲基本數據類型。
裝箱:將基本數據類型用它們對應的引用類型包裝起來。
5.在一個靜態方法內調用一個非靜態成員爲什麼是非法的?
由於靜態方法可以不通過對象進行調用,因此在靜態方法裏,不能調用其他非靜態變量,也不可以訪問非靜態變量成員。
6.成員變量和局部變量的區別有哪些?
- 從語法形式上來看:成員變量是定義在類中,是屬於類的,局部變量是定義在方法中的,是屬於方法的。成員變量可以被public、pirvate、static等修飾符修飾,局部變量不能被訪問修飾符以及static鎖修飾,但是成員變量和局部變量都可以被final修飾。
- 從變量在內存中的存儲方式來看:如果一個成員變量被static鎖修飾,那麼這個變量是屬於類的,如果成員變量沒有被static所修飾,那麼這個變量是屬於類的實例的。對象存儲於堆內存,如果局部變量是基本數據類型,則存儲在棧內存中,如果是引用數據類型,那麼存儲的是指向堆內存對象的引用或指向常量池中對象的地址。
- 從變量在內存中的生存時間來看:成員變量是對象的一部分,隨着對象的創建銷燬而存在消亡,而拒不變量是隨着方法的調用結束而存在消亡的。
- 成員變量如果沒有賦初始值,那麼會根據成員變量的類型賦值類型的默認值,而局部變量不會自動賦值。
7.靜態方法和實例方法有什麼不同?
- 在外部調用靜態方法時,可以用“類名.方法名”的方式,也可以用“對象名.方法名”的方式,而實例方法只能用“對象名.方法名”的方式去調用,調用靜態方法可以不用創建對象。
- 靜態方法在訪問本類成員時,只允許訪問靜態成員變量和靜態方法,而不允許訪問實例成員變量和實例方法,實例方法就沒有這個限制。
8.講一下你對final關鍵字的理解
- 對於一個被final修飾的變量,如果是基本數據類型,則在初始化之後不能再被修改,如果是引用數據類型,則在初始化之後不能再讓其指向另一個對象。
- 對於一個被final修飾的類,該類不可以被繼承,類中的所有方法都會被隱式指定爲final方法。
- 使用final方法主要是爲了將方法進行鎖定,不讓繼承它的子類修改該方法的含義,
9.Java序列化中如果有些字段不想被序列化該如何解決?
對於不想序列化的變量,可以使用transient關鍵字修飾。
transient關鍵字的作用:阻止實例中那些用此關鍵字修飾的變量序列化。當對象被反序列化時,被treanient修飾的變量不會被持久化和恢復。transient只能修飾變量,不能修飾類和方法。
10.構造方法的作用是什麼?一個類能不能不聲明構造方法?構造方法的特性有哪些?
問題1:主要作用是完成對類的初始化工作。
問題2:可以不聲明構造方法,如果不聲明構造方法也會有一個默認的無參構造方法。
問題3:
- 方法名與類名相同。
- 不能帶有返回值,但是不能用viod聲明構造方法。
- 生成類的對象的時候自動執行,不用自己手動調用
11.異常和錯誤的區別是什麼?在哪些情況下finally語句塊不會執行?
問題1:異常(Exception)是程序本身可以處理的異常。錯誤(Error)是程序無法處理的錯誤。
問題2:
- finally語句塊第一行代碼出現異常。(如果是其他行,finally語句塊還是會執行)
- 在前面代碼中使用了System.exit(int)已退出程序。(exit是帶參數的函數,如果System.exit(int)在異常語句之後,finally語句塊還是會執行)
- 程序所在的線程死亡。
- CPU關閉了。
12.什麼是深拷貝?什麼是淺拷貝?
淺拷貝:對基本數據類型進行值傳遞(拷貝值),對引用數據類型進行引用傳遞(拷貝地址),修改靠背後的數據會影響原數據叫做淺拷貝。
深拷貝:對基本數據類型進行值傳遞(拷貝值),對引用數據類型,創建一個新的對象,複製原對象的內容,修改拷貝後的數據不會影響原數據叫做深拷貝。
13.轉發與重定向有什麼區別?
轉發:
- 地址欄不會改變。
- 轉發只能轉發到當前web應用內的資源(當前頁面,不會跳轉頁面)。
- 在轉發過程中可以將數據存儲到request域對象中。
重定向:
- 地址欄會發生改變,變成重定向的地址。
- 重定向可以跳轉到當前web應用也可以跳轉到其他web應用(會跳轉當前頁面或者新的頁面),甚至是外部域名網站。
- 重定向過程中不可以將數據存儲到request域對象中。
追問:講一下重定向的實現原理
重定向會發送兩次請求,瀏覽器認識的狀態碼是302時,會再次想服務器發送一次請求,獲取location的value值進行重定向。
14.講一下Servlet的生命週期(重點)
- 通過調用構造方法創建servlet對象,默認情況下,第一次訪問servlet的時候創建servlet對象,只調用一次,證明servlet對象再tomcat中是單例的。
- Servlet調用init()方法進行初始化,只調用一次。
- Servlet調用service()方法來處理客戶端的請求,客戶端每發出一次請求調用一次。
- Servlet通過調用destory來銷燬servlet對象,停止服務器或者重新部署web應用時銷燬servlet對象,只調用一次。
- Servlet由JVM垃圾回收器進行回收。
追問:怎麼證明Servlet是單例的?
因爲Servlet是通過Java反射機制讀取web.xml配置中的servlet-class完整路徑進行反射從而默認執行無參構造函數的,所以只要Servlet類執行無參構造函數,就只會執行一次,所以Servlet是單例的。
15.@Transactional註解在什麼情況下會失效?爲什麼?
一個方法調用另一個方法時,即使被調用的方法已經使用了@Transactional註解,事物也buhui有效執行。因爲Spring官方說明在代理下(默認或者配置爲proxy-targer-class=“true”),只有當前代理類的外部方法調用註解方法時代理纔會被攔截。
16.你對加班是怎麼看的?(HR必問)
- 業務發展好、公司快速發展,項目緊急等加班非常樂意。
- 自己會提高工作效率,儘量減少加班的需要。
- 合理自行發揮,千萬不要說不喜歡加班,也不要說自己很喜歡加班!