阿里P5-基礎知識
1.Try…catch…finally 執行中,在 try 或 catch代碼塊中return還會執行finally代碼?
答案首先是肯定的,因為Try…catch…finally代碼塊里的finally子句里的陳述句是一定會被執行的,只是在finally子句的陳述句會對整個代碼塊的執行結果會有影響嗎?會有的,主要有兩大類情況:
a.finally中最好不要包含return,否則程式會提前退出,回傳值不是try或catch中保存的回傳值,
b.如果finally中沒有return陳述句,但是改變了要回傳的值,這里有點類似與參考傳遞和值傳遞的區別,分以下兩種情況:
1)如果return的資料是基本資料型別或文本字串,則在finally中對該基本資料的改變不起作用,try中的return陳述句依然會回傳進入finally塊之前保留的值,
2)如果return的資料是參考資料型別,而在finally中對該參考資料型別的屬性值的改變起作用,try中的return陳述句回傳的就是在finally中改變后的該屬性的值,
2. Interface與abstract類的區別
含有abstract修飾符的class即為抽象類,abstract 類不能創建的實體物件,含有abstract方法的類必須定義為abstract class,abstract class類中的方法不必是抽象的,abstract class類中定義抽象方法必須在具體子類中實作,所以,不能有抽象構造方法或抽象靜態方法,如果的子類沒有實作抽象父類中的所有抽象方法,那么子類也必須定義為abstract型別,
介面(interface)可以說成是抽象類的一種特例,介面中的所有方法都必須是抽象的,介面中的方法定義默認為public abstract型別,介面中的成員變數型別默認為public static final,
**介面和抽象類的概念不一樣,介面是對動作的抽象,抽象類是對根源的抽象,抽象類表示的是,這個物件是什么,介面表示的是,這個物件能做什么,**比如,男人,女人,這兩個類(如果是類的話……),他們的抽象類是人,說明,他們都是人.人可以吃東西,狗也可以吃東西,你可以把“吃東西”定義成一個介面,然后讓這些類去實作它.所以,在高級語言上,一個類只能繼承一個類(抽象類)(正如人不可能同時是生物和非生物),但是可以實作多個介面(吃飯介面、走路介面),
第一點. 介面是抽象類的變體,介面中所有的方法都是抽象的,而抽象類是宣告方法的存在而不去實作它的類,
第二點. 介面可以多繼承,抽象類不行
第三點. 介面定義方法,不能實作,而抽象類可以實作部分方法,
第四點. 介面中基本資料型別為static 而抽類象不是的,
當你關注一個事物的本質的時候,用抽象類;當你關注一個操作的時候,用介面,在應用上的區別:介面更多的是在系統架構設計方法發揮作用,主要用于定義模塊之間的通信契約,而抽象類在代碼實作方面發揮作用,可以實作代碼的重用,例如,模板方法設計模式是抽象類的一個典型應用,假設某個專案的所有Servlet類都要用相同的方式進行權限判斷、記錄訪問日志和處理例外,那么就可以定義一個抽象的基類,讓所有的Servlet都繼承這個抽象基類,在抽象基類的service方法中完成權限判斷、記錄訪問日志和處理例外的代碼,在各個子類中只是完成各自的業務邏輯代碼,
3.final 、static在 java 中有什么作用?
final作為Java中的關鍵字可以用于三個地方,用于修飾類、類屬性和類方法,
特征:凡是參考final關鍵字的地方皆不可修改!
(1)修飾類:表示該類不能被繼承;
(2)修飾方法:表示方法不能被重寫;
(3)修飾變數:表示變數只能一次賦值以后值不能被修改(常量),
當final修飾的是一個基本資料型別資料時, 這個資料的值在初始化后將不能被改變; 當final修飾的是一個參考型別資料時, 也就是修飾一個物件時, 參考在初始化后將永遠指向一個記憶體地址, 不可修改. 但是該記憶體地址中保存的物件資訊, 是可以進行修改的.
static一般表示“靜態”的意思,可修飾成員變數和方法,也可形成靜態static代碼塊,另外注意Java中沒有全域變數的概念,被static修飾的成員變數或方法獨立于該類的物件,只要該類被加載,可以在物件創建即實體化之前訪問,
靜態變數
被static修飾的變數即為靜態變數,當JVM加載類后,可以通過類名直接訪問,類的所有實體共享一個static變數,
靜態方法
靜態方法可以直接通過類名呼叫,但是不能直接訪問所屬類的實體變數和方法,只能訪問所屬類的靜態變數和方法,這是因為實體成員只與特定物件關聯,
靜態代碼塊
為類中獨立于類成員的static陳述句塊,不在任何方法體內,當JVM加載類時,就會執行靜態代碼塊,無需等待實體化,static陳述句塊可以多個,JVM會按照它們的先后順序依次執行,
static和final一起時有什么作用 ?
static final一起使用修飾成員變數或方法時,可以理解為“全域常量”,均可通過類名直接訪問,
4.String、StringBuffer、StringBulider它們之間有什么區別?
詳見:https://blog.csdn.net/itchuxuezhe_yang/article/details/89966303
5.BIO、NIO、AIO 有什么區別?
BIO表示同步阻塞式IO,服務器實作模式為一個連接一個執行緒,即客戶端有連接請求時服務器端就需要啟動一個執行緒進行處理,如果這個連接不做任何事情會造成不必要的執行緒開銷,當然可以通過執行緒池機制改善,
NIO表示同步非阻塞IO,服務器實作模式為一個請求一個執行緒,即客戶端發送的連接請求都會注冊到多路復用器上,多路復用器輪詢到連接有I/O請求時才啟動一個執行緒進行處理,
AIO表示異步非阻塞IO,服務器實作模式為一個有效請求一個執行緒,客戶端的I/O請求都是由作業系統先完成IO操作后再通知服務器應用來啟動執行緒進行處理,
應用場景:
BIO適用于連接數目比較小且固定的架構,該方式對服務器資源要求比較高,JDK 1.4以前的唯一選擇,
NIO適用于連接數目多且連接比較短(輕操作)的架構,如聊天服務器,編程復雜,JDK 1.4開始支持,如在Netty框架中使用,
AIO適用于連接數目多且連接比較長(重操作)的架構,如相冊服務器,充分呼叫作業系統參與并發操作,編程復雜,JDK 1.7開始支持,
備注:在大多數場景下,不建議直接使用JDK的NIO類別庫(門檻很高),除非精通NIO編程或者有特殊的需求,在絕大多數的業務場景中,可以使用NIO框架Netty來進行NIO編程,其既可以作為客戶端也可以作為服務端,且支持UDP和異步檔案傳輸,功能非常強大,
補充:
同步IO和異步IO:
IO操作主要分為兩個步驟,即發起IO請求和實際IO操作,同步IO與異步IO的區別就在于第二個步驟是否阻塞,
若實際IO操作阻塞請求行程,即請求行程需要等待或者輪詢查看IO操作是否就緒,則為同步IO,
若實際IO操作并不阻塞請求行程,而是由作業系統來進行實際IO操作并將結果回傳,則為異步IO,
阻塞IO和非阻塞IO
IO操作主要分為兩個步驟,即發起IO請求和實際IO操作,阻塞IO與非阻塞IO的區別就在于第一個步驟是否阻塞,
若發起IO請求后請求執行緒一直等待實際IO操作完成,則為阻塞IO,
若發起IO請求后請求執行緒回傳而不會一直等待,即為非阻塞IO,
同步,就是我呼叫一個功能,該功能沒有結束前,我死等結果,
異步,就是我呼叫一個功能,不需要知道該功能結果,該功能有結果后通知我(回呼通知),
阻塞,就是呼叫我(函式),我(函式)沒有接收完資料或者沒有得到結果之前,我不會回傳,
非阻塞,就是呼叫我(函式),我(函式)立即回傳,通過select通知呼叫者
轉載請註明出處,本文鏈接:https://www.uj5u.com/qita/155387.html
標籤:其他
上一篇:java簡介--環境安裝
下一篇:兩兩交換鏈表中的節點
