Java-進階之問題記錄

1.Java什麼時候用重載,什麼時候用重寫?

重載是多樣性,重寫是增強劑。
           Java中的重載overload最重要且最常用的應用場景是構造器的重載,構造器重載後,提供多種參數形式的構造器,可以應對不同的業務需求,加強程序的健壯性和可擴展性。比如Spring源碼中的ClassPathXmlApplicationContext,他的構造函數使用重載一共提供了10個構造函數,這樣就爲我們的業務選擇提供了多樣性。在應用到方法中時,主要是爲了增強方法的健壯性和可擴展性。再比如我們目前工作中的短信工具SMSUtil,發短信的方法就會重載,針對不同業務場景下的不同形參,提供短信發送方法,這樣又提高了工具類的擴展性和健壯性。
          總結:重載必須要修改方法的形參列表,可以修改方法的返回值類型,也可以修改方法的異常信息即訪問權限;使用範圍是同一個類中,目的是對方法的功能進行擴展,以應對多業務場景的不同使用需求。

Java中的重寫主要用於子類對父類方法的擴展和修改,但是在我們實際開發中,爲了避免程序混亂,重寫一般都是爲了方法的擴展,比如在cglib方式實現的動態代理中,代理類就是繼承了目標類,對目標類的方法進行重寫,同時在方法前後進行切面注入。
           總結:方法重寫時,參數列表和返回值類型時一定不能修改的,異常可以減少或者刪除,但是不能拋出新的或者更廣的異常,方法的訪問權限可以降低限制,但是不能做更嚴格的限制。

2.舉例一個更傾向於抽象類,而不是使用接口的設計場景。

接口是一種定義,抽象類是一種抽象的實現,比較典型的使用就是模板方法:在使用模板方法定義某種操作流程時,更傾向於使用抽象類,比如JDBCTemplate.舉例:獲取第三方數據,在一個項目中我們要獲取芝麻分,法院的信用報告,運營商報告,我們會使用一個抽象類來定義整個流程。1、參數設置,2、數據獲取,3、結果解析,4、結果存儲,5、日誌記錄;在這個場景裏面,比較適用於使用抽象類來定義整個業務流程,具體的數據獲取和結果解析交給子類來處理。這是個典型的模板方法模式。使用抽象類可以定義關鍵步驟和指定執行流程。而如果使用接口,則並不合適。

3.在java中如何應用多線程?

1.繼承Thread類(本質上是對Runnable接口的實現)
           2.實現Runnable接口
           3.Callable/Future帶返回值的線程
           4.ThreadPool

4.線程的生命週期?

 

Thread.yield()方法作用是:暫停當前正在執行的線程對象,並執行其他線程

5.線程的啓動爲什麼要用start()方法?

在Thread類中,start()方法是一個同步啓動的方法。在start()方法內部調用了一個start0的方法。而start0()方法是一個native方法。在JVM層面可以發現start0對應JVM_StartThread。線程的啓動就是由JVM_StartThread完成的。在JVM_StartThread中基於os去進行一個線程的啓動操作,線程啓動之後會回調run()方法。

http://hg.openjdk.java.net/jdk8/jdk8/jdk/file/00cd9dc3c2b5/src/share/native/java/lang/Thread.c  (定位JVM_StartThread)

 jvm.cpp(在HotSpot源碼中可以找到JVM_StartThread)

6.線程的終止?

推薦使用interrupt()方法當其他線程通過調用當前線程的 interrupt 方法,表示向當前線程打個招呼,告訴他可以中斷線程的執行了,至於什麼時候中斷,取決於當前線程自己。線程通過檢查資深是否被中斷來進行相應,可以通過isInterrupted()來判斷是否被中斷。

7.synchronized->鎖在內存中的佈局?

8.在Java中爲什麼不允許靜態方法中訪問非靜態變量?

靜態變量:被static關鍵字修飾的變量,稱爲靜態變量或者類變量。
實例變量:即非靜態變量,沒有被static關鍵字修飾的變量。

JVM層面,程序運行時,只要程序加載了類的字節碼,靜態變量就會被分配內存空間。換言之,靜態變量可以被稱爲類變量,靜態變量不屬於某個對象。

而實例變量則不同,實例變量是屬於對象的屬性,必須創建了對象,實例變量纔會被加載分配內存空間

所以靜態方法中無法訪問非靜態變量。

爲什麼這樣設計?
1.方便在沒有創建對象的情況下進行調用,比如設計公共工具類。
2.static修飾的靜態代碼塊,在類加載的時候只會執行一次。可以用來優化程序性能。

9.列舉你所瞭解的軟件分層場景、軟件分層有那些好處?

假如我們初次瞭解到Spring AOP的概念,我們在看到源碼的時候便可以清楚地知道spring-aop這個模塊就是Sping AOP思想地具體實現。這個時候我們回顧AOP地概念-面向切面編程-把那些影響多個類的行爲封裝到可重用的模塊中去。、

這個時候具體怎麼實現的我們需要通過源碼去了解,在spring-aop模塊中有一個包叫做intercept:攔截。這個時候我們就有了一個模糊的概念,Spring AOP 是通過攔截的方式去把影響多個類的行爲去封裝到可重用的模塊中。這無疑給我們的學習提供了一個較爲清晰的方向。

總結:軟件分層不是爲了分層而分層,而是爲了讓我們去思考如何讓我們的代碼具有更高的
擴展性,可讀性等等

10.在JVM層面Java創建對象?

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