每日一面系列之Java基礎(下)

1.面向對象和麪向過程有什麼區別?

面向過程:面向過程的效率要高於面向對象,因爲類的調用需要實例化,資源開銷比較大,一般當性能是最重要的指標的時候會採用面向過程的方式進行開發,比如單片機、嵌入式開發等。

面向對象:面向對象易維護、易複用、易擴展。因爲面向對象有封裝、繼承、多態的特性,所以更加方便設計出低耦合、靈活的系統,更加方便維護,面向對象的性能要低於面向過程。

追問:面向過程的性能比面向對象低?

面向過程也需要分配內存,計算內存偏移量。Java是面向對象的代表語音,Java是一個半編譯語言,最終的執行並不是直接可以被CPU執行的二進制機器碼,而面向過程語音大多都是直接編譯成機器碼在電腦上執行,但是一些面向過程的腳本語言性能不一定就比Java好。

2.Java與C++有什麼區別?(有很多人都不會C++,但是這個問題有面試官就喜歡問,就這幾點,背下吧!)

  1. 都是面嚮對象語言,都支持封裝、繼承、多態。
  2. Java不提供指針直接訪問內存,程序內存更加安全。
  3. Java類是單繼承的,C++可以多繼承,雖然Java的類不可以多繼承,但是Java的接口可以多繼承。
  4. Java有自動的內存管理機制,不需要開發人員收懂釋放無用內存。
  5. 在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.成員變量和局部變量的區別有哪些?

  1. 從語法形式上來看:成員變量是定義在類中,是屬於類的,局部變量是定義在方法中的,是屬於方法的。成員變量可以被public、pirvate、static等修飾符修飾,局部變量不能被訪問修飾符以及static鎖修飾,但是成員變量和局部變量都可以被final修飾。
  2. 從變量在內存中的存儲方式來看:如果一個成員變量被static鎖修飾,那麼這個變量是屬於類的,如果成員變量沒有被static所修飾,那麼這個變量是屬於類的實例的。對象存儲於堆內存,如果局部變量是基本數據類型,則存儲在棧內存中,如果是引用數據類型,那麼存儲的是指向堆內存對象的引用或指向常量池中對象的地址。
  3. 從變量在內存中的生存時間來看:成員變量是對象的一部分,隨着對象的創建銷燬而存在消亡,而拒不變量是隨着方法的調用結束而存在消亡的。
  4. 成員變量如果沒有賦初始值,那麼會根據成員變量的類型賦值類型的默認值,而局部變量不會自動賦值。

7.靜態方法和實例方法有什麼不同?

  1. 在外部調用靜態方法時,可以用“類名.方法名”的方式,也可以用“對象名.方法名”的方式,而實例方法只能用“對象名.方法名”的方式去調用,調用靜態方法可以不用創建對象。
  2. 靜態方法在訪問本類成員時,只允許訪問靜態成員變量和靜態方法,而不允許訪問實例成員變量和實例方法,實例方法就沒有這個限制。

8.講一下你對final關鍵字的理解

  1. 對於一個被final修飾的變量,如果是基本數據類型,則在初始化之後不能再被修改,如果是引用數據類型,則在初始化之後不能再讓其指向另一個對象。
  2. 對於一個被final修飾的類,該類不可以被繼承,類中的所有方法都會被隱式指定爲final方法。
  3. 使用final方法主要是爲了將方法進行鎖定,不讓繼承它的子類修改該方法的含義,

9.Java序列化中如果有些字段不想被序列化該如何解決?

對於不想序列化的變量,可以使用transient關鍵字修飾。

transient關鍵字的作用:阻止實例中那些用此關鍵字修飾的變量序列化。當對象被反序列化時,被treanient修飾的變量不會被持久化和恢復。transient只能修飾變量,不能修飾類和方法。

10.構造方法的作用是什麼?一個類能不能不聲明構造方法?構造方法的特性有哪些?

問題1:主要作用是完成對類的初始化工作。

問題2:可以不聲明構造方法,如果不聲明構造方法也會有一個默認的無參構造方法。

問題3

  1. 方法名與類名相同。
  2. 不能帶有返回值,但是不能用viod聲明構造方法。
  3. 生成類的對象的時候自動執行,不用自己手動調用

11.異常和錯誤的區別是什麼?在哪些情況下finally語句塊不會執行?

問題1:異常(Exception)是程序本身可以處理的異常。錯誤(Error)是程序無法處理的錯誤。

問題2

  1. finally語句塊第一行代碼出現異常。(如果是其他行,finally語句塊還是會執行)
  2. 在前面代碼中使用了System.exit(int)已退出程序。(exit是帶參數的函數,如果System.exit(int)在異常語句之後,finally語句塊還是會執行)
  3. 程序所在的線程死亡。
  4. CPU關閉了。

12.什麼是深拷貝?什麼是淺拷貝?

淺拷貝:對基本數據類型進行值傳遞(拷貝值),對引用數據類型進行引用傳遞(拷貝地址),修改靠背後的數據會影響原數據叫做淺拷貝。

深拷貝:對基本數據類型進行值傳遞(拷貝值),對引用數據類型,創建一個新的對象,複製原對象的內容,修改拷貝後的數據不會影響原數據叫做深拷貝。

13.轉發與重定向有什麼區別?

轉發

  1. 地址欄不會改變。
  2. 轉發只能轉發到當前web應用內的資源(當前頁面,不會跳轉頁面)。
  3. 在轉發過程中可以將數據存儲到request域對象中。

重定向

  1. 地址欄會發生改變,變成重定向的地址。
  2. 重定向可以跳轉到當前web應用也可以跳轉到其他web應用(會跳轉當前頁面或者新的頁面),甚至是外部域名網站。
  3. 重定向過程中不可以將數據存儲到request域對象中。

追問:講一下重定向的實現原理

重定向會發送兩次請求,瀏覽器認識的狀態碼是302時,會再次想服務器發送一次請求,獲取location的value值進行重定向。

14.講一下Servlet的生命週期(重點)

  1. 通過調用構造方法創建servlet對象,默認情況下,第一次訪問servlet的時候創建servlet對象,只調用一次,證明servlet對象再tomcat中是單例的。
  2. Servlet調用init()方法進行初始化,只調用一次。
  3. Servlet調用service()方法來處理客戶端的請求,客戶端每發出一次請求調用一次。
  4. Servlet通過調用destory來銷燬servlet對象,停止服務器或者重新部署web應用時銷燬servlet對象,只調用一次。
  5. Servlet由JVM垃圾回收器進行回收。

追問:怎麼證明Servlet是單例的?

因爲Servlet是通過Java反射機制讀取web.xml配置中的servlet-class完整路徑進行反射從而默認執行無參構造函數的,所以只要Servlet類執行無參構造函數,就只會執行一次,所以Servlet是單例的。

15.@Transactional註解在什麼情況下會失效?爲什麼?

一個方法調用另一個方法時,即使被調用的方法已經使用了@Transactional註解,事物也buhui有效執行。因爲Spring官方說明在代理下(默認或者配置爲proxy-targer-class=“true”),只有當前代理類的外部方法調用註解方法時代理纔會被攔截。

16.你對加班是怎麼看的?(HR必問)

  1. 業務發展好、公司快速發展,項目緊急等加班非常樂意。
  2. 自己會提高工作效率,儘量減少加班的需要。
  3. 合理自行發揮,千萬不要說不喜歡加班,也不要說自己很喜歡加班!

每日一面天天練,高薪offer隨時有!

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