成員變量在類內的方法之外,局部變量在方法內
13. 靜態變量和實例變量有什么區別?
A。 靜態變量是由修飾符修飾的變量。 內存中只有一個內存空間。 靜態變量的內存分配是在類加載過程中完成的,可以通過(類名.)直接訪問。
b. 實例變量必須依賴于某個實例。 它需要先創建對象,然后通過該對象訪問它。 每次創建實例對象時,都會為實例變量分配不同的內存,每個對象訪問自己的實例變量。
C。 一個類無論創建多少個對象,靜態變量都只初始化一次,所有實例都可以訪問這個靜態變量,并且可以通過類名直接訪問。
14.類可以繼承嗎?
不能。 該類被final修飾,因此不能被繼承。
15.類中常用的方法有哪些?
獲取字符串的長度:()
比較字符串:()
連接字符串:()
提取字符串:()
搜索字符串:()
分割字符串:split()
忽略字符串大小寫:()
將所有英文字符轉換為小寫:()
將所有英文字符轉換為大寫:( )
刪除空格:trim()
16. 和 之間有什么區別?
:適合少量字符串操作
:線程不安全,適合單線程下對字符緩沖區進行大量操作的情況
:線程安全,效率低,適合多線程下對字符緩沖區進行大量操作的情況
(操作就是字符串的拼接) JDBC中拼接sql
17.您對面向對象的4大特性有何理解?
封裝:封裝一般認為是綁定數據和操作數據的方法,只能通過定義好的接口來訪問數據。 我們在類中編寫的方法是對實現細節的一種封裝; 我們寫的類就是對數據和數據操作的封裝。 可以說,封裝就是把所有能隱藏的東西都隱藏起來,只向外界提供最簡單的編程接口。 (減少代碼冗余)
繼承:繼承是通過從現有類獲取繼承信息來創建新類的過程。 提供繼承信息的類稱為父類(超類、基類); 接收繼承信息的類稱為子類(派生類)。
多態性:多態性是指允許不同子類型的對象對同一消息做出不同的響應。 簡單地說,它是使用相同的對象引用調用相同的方法,但做不同的事情。 多態性分為編譯時多態性和運行時多態性。 方法重載()實現了編譯時多態(也稱為預綁定),而方法重寫()實現了運行時多態(也稱為后綁定)
抽象:抽象是總結一類對象的共同特征來構造類的過程,包括數據抽象和行為抽象。 抽象只關注對象的屬性和行為,而不關注這些行為的細節。
18.方法重載和重寫有什么區別? (方法重載發生在類中,方法重寫發生在父類與子類之間)
方法重載和重寫都是實現多態的方法。 區別在于前者實現了編譯時多態,而后者實現了運行時多態。 重載發生在類中。 如果同名方法有不同的參數列表(不同的參數類型、不同的參數個數,或兩者都有),則認為是重載; 重寫發生在子類和父類之間,重寫要求子類重寫的方法與父類重寫的方法具有相同的返回類型,比父類重寫的方法有更好的訪問權限,并且不能聲明更多的異常比父類重寫的方法(代碼交換原理)。 重載對返回類型沒有特殊要求。
方法重載規則:
1.方法名稱相同,但參數列表中參數的順序、類型和數量不同。
2.重載與方法的返回值無關,它發生在類中。
3、可以拋出不同的異常,可以使用不同的修飾符。
方法重寫規則:
1、參數列表和返回類型必須與重寫的方法完全一致。
2、構造方法不能重寫,聲明為final的方法不能重寫,聲明為final的方法不能重寫,但可以再次聲明。
3、發生在父類與子類之間時,子類的訪問權限不能比父類嚴格。
19.(默認)有什么區別?
20. 多重繼承下初始化的順序是什么?
先父類后子類,先屬性后構造方法。
21、使用運行時多態開發的思路是什么?
A。 編寫父類
b. 寫一個子類,子類重寫父類方法
C。 運行時,使用父類的類型和子類的對象
Pet pet = new Dog();
22.類中的向上轉型和向下轉型有什么區別?
向下轉型:超類轉換為子類(使用強制轉換)(對象類或接口)
向上轉換:子類使用父類的類型,子類的對象轉換為父類(自動類型轉換)
23. 接口和抽象類有什么區別?
差異一:語法方面
1、繼承實現((抽象類單繼承,接口多實現)接口還可以繼承其他接口)
2、成員變量
①. 抽象類中可以有普通成員變量,但接口中不能有普通成員變量
②. 抽象類和接口都可以包含靜態成員變量
3. 方法
①. 抽象類可以有構造函數,但接口不能有構造函數。
②.抽象類可以包含非抽象普通方法,接口中的所有方法都必須是抽象的,并且不能有非抽象普通方法。
③. 抽象類中的抽象方法的訪問類型可以是默認類型,但接口中的抽象方法只能是類型,默認是類型。
④. 抽象類可以包含靜態方法,但接口不能包含靜態方法。
差異 2:概念方面
抽象類體現了繼承關系。 要使繼承關系合理,父類和派生類之間必須存在“is-a”關系,即父類和派生類的概念本質上應該是相同的。 接口的情況并非如此。 它不要求接口的實現者在概念上與接口定義一致,而只需實現接口定義的契約,即“has-a”關系。
設計接口時要注意穩定性,方法的參數和返回值不能隨意改變。
差異三:設計方面
抽象層次不同,抽象類是類的抽象,接口是行為的抽象。 抽象類將整個類抽象為一個整體,包括屬性和行為,而接口抽象了類的各個部分(行為)。 抽象類是自下而上抽象的,接口是自上而下設計的。
24.java中常見的異常類型?
25、編寫多個異常的注意事項?
A。 catch語句的排列順序:先子類,后父類
b. 發生異常時按順序一一匹配
C。 只執行與異常類型匹配的第一個catch語句
(不要“吃異?!?,父類有底線)
在catch中,需要輸出異常信息,并打印異常發生處的堆棧信息。 如果沒有輸出,就會導致異常發生,但由于沒有相關錯誤信息的輸出,所以異常發生的情況未知。 這種情況被稱為“飲食異?!?。
26. 錯誤和錯誤有什么區別?
Error類和該類的父類都是類,它們的區別如下:
Error類一般指與虛擬機相關的問題,如系統崩潰、虛擬機錯誤、內存空間不足、方法調用棧溢出等。 對于這種錯誤導致的應用程序中斷,程序本身無法恢復和預防。 遇到此類錯誤時,建議讓程序終止。
類代表程序可以處理、捕獲并可能從中恢復的異常。 遇到這樣的異常,應該盡可能的處理異常,恢復程序,不能隨意終止異常。
27.和有什么區別?
運行時異常( ) 編譯可以通過,但一運行就終止。 程序不會處理運行時異常。 如果發生此類異常,程序將終止。 (bug的來源,需要檢查運行時異常)(父類)
檢查異常 ( ) 或使用 try。 。 。 catch catch,或者用語句拋出,交給其父類處理,否則編譯不通過。 (父親)
28. Final、 和 有什么區別?
Final:用于聲明屬性、方法、類,分別表示屬性不可變、方法不可重寫、類不可繼承。
:異常處理語句結構的一部分,表示始終執行。
:類的方法。 待回收對象的這個方法會在垃圾收集器執行時被調用。 可以重寫此方法以在垃圾收集期間提供其他資源回收,例如關閉文件。 這是一個被動方法(實際上是一個回調方法),我們不需要調用。
29.投擲和投擲有什么區別?
扔:
A。 該語句用在方法體中,表示拋出異常,由方法體中的語句處理。
b. 它是一個專門拋出異常的動作,所以它拋出的是一個異常實例,執行 throw 一定拋出了某種異常。
:
A。 就是聲明在方法聲明之后使用異常語句,表示如果拋出異常,則方法的調用者將處理該異常。
b. 主要是聲明該方法將拋出某種類型的異常,以便其使用者需要知道需要捕獲的異常類型。
C。 表示有可能出現異常,但不一定會出現這種異常
30、什么是裝箱和拆箱,以及包裝的應用場景?
拆箱 - 包裝類變量可以分配原始類型
裝箱 - 原始類型的變量可以分配一個包裝類
封裝類的應用場景:
主要用在集合類中。 (集合不允許存儲基本數據類型。存儲數字時,使用包裝類型)
包裝類的作用:
A。 集合不允許存儲基本數據類型。 存儲數字時,使用包裝類型;
b. 包裝類提供了一系列實用的方法
31.List、Set、Map有什么區別?
①.List和Set是存儲單列數據的集合,Map是存儲鍵、值等雙列數據的集合;
②. List中存儲的數據是有序的并且允許重復;
③. Map中存儲的數據是無序的,它的key不能重復,它的value可以重復。
④. Set中存儲的數據是無序的,不允許重復,但是元素在集合中的位置是由元素決定的,位置是固定的(Set集合是基于數據存儲的,所以位置是固定,但位置不受用戶控制,因此集合中的元素對于用戶來說仍然是亂序的)
32.有什么區別?
實現了一個變長數組,并且在內存中分配了連續的空間。 遍歷元素和隨機訪問元素的效率比較高。
使用鏈表存儲。 插入和刪除元素時效率更高。
33、如果一個存儲有很多值,但不知道KEY是什么,如何遍歷所有的KEY和VALUE?
Get:接口的()方法
* 方法
* (): 判斷是否還有其他可訪問的元素
* next():返回下一個要訪問的元素
(),返回這個map中包含的映射(鍵值)
() 方法獲取密鑰; ()方法獲取值
(),返回鍵集
取出所有key的集合,獲取對象,取出key,根據key取出對應的value
34.進程和線程有什么區別?
進程是指在內存中運行的應用程序。 每個進程都有自己獨立的內存空間,一個進程中可以啟動多個線程。 例如,在系統中,一個正在運行的exe就是一個進程。
線程是指進程中的一個執行過程,一個進程中可以運行多個線程。 例如,java.exe進程中可以運行許多線程。 線程總是屬于一個進程。
進程中包含線程,線程必須屬于某個進程。 一個進程中的多個線程共享該進程的內存,兩者之間是一對多的關系。
35、線程的實現方法有哪些?
①. 繼承類
特點:編寫方便,可以直接操作線程; 適合單繼承
②. 實現接口
特點:避免單一繼承的限制; 促進資源共享
③. 編寫實現類
特點:需要實現call()方法。 call方法與run方法不同,call方法有返回值。
36、多線程中調用start方法和run方法有什么區別?
調用run()方法:主線程只有一條執行路徑; 沒有啟動新線程(普通方法調用)。
調用start()方法:多條執行路徑,主線程和子線程并行交替執行; 啟動一個線程。
調用start方法就是線程的啟動。 調用后,線程進入就緒狀態。
Run方法編寫了線程要實現的功能。 一般不直接調用,而是由系統調用。 如果調用的話,就是普通的方法調用。
37. 多線程有問題嗎?
什么時候使用多線程開發?
①. 程序需要同時執行兩個或多個任務。 例如:手機淘寶中“我的界面”的后臺程序,開啟多個線程從不同系統獲取數據,組合發送給前端APP。
②. 程序需要實現一些需要等待的任務,例如:導出過大的Excel文件。
③. 需要一些程序在后臺運行,例如:Java垃圾收集器程序。
線程安全注意事項:
1、出現線程安全問題:當多個線程共享數據時,由于其中一個線程還沒有完成對共享數據的操作,其他線程就會參與進來,因此出現了數據篡改的問題。
2、如何解決線程安全問題:要保證一個線程操作共享數據時,其他線程必須在外面等待,直到操作共享數據的線程執行完畢,其他線程才能操作共享數據。
3、同步方法的鎖是當前對象this,同步代碼塊需要指定鎖對象(必須唯一); 相比之下,同步代碼塊可以更精確地控制所管理的代碼。
另:調試多線程的排查方法是輸出多條日志,而不是Debug。 使用log4j輸出中間處理結果來排查問題。
38.有什么區別?
全部實現Map接口,繼承類,繼承類
線程安全,效率低下,key和value都不允許為null。
它是非線程安全的,高效,并且鍵和值都允許為空。
為什么線程安全效率低下:
線程安全是以犧牲效率為代價的。 它是(一種同步鎖,用于共享數據,一次只有一個線程可以訪問共享數據),所以線程安全不需要多線程訪問時使用。 實現同步。
39.Join和yield有什么區別?
Yield:(禮貌)當前線程貢獻CPU使用權,但當前線程仍有可能再次獲得CPU使用權。
Join:該方法出現時,掛起當前線程,執行其他進程,等待其他線程執行完畢后再執行掛起的進程。
40.線程的狀態?
線程的狀態
在某些條件下,線程的狀態會發生變化。 一個線程有以下幾種狀態:
1.新建狀態(New):一個線程對象被新創建。
2.就緒狀態():線程對象創建后,其他線程調用該對象的start()方法。 該狀態的線程位于“可運行線程池”中,變為可運行狀態,只等待獲取CPU的使用權。 即處于就緒狀態的進程擁有其運行所需的除CPU之外的所有資源。
3、運行狀態():處于就緒狀態的線程獲取CPU并執行程序代碼。
4、阻塞狀態():阻塞狀態是指線程由于某種原因放棄了CPU的使用權,暫時停止運行。 直到線程進入就緒狀態,才有機會進入運行狀態。
阻塞分為三種類型:
(1)、等待阻塞:正在運行的線程執行wait()方法,該線程會釋放所有占用的資源,JVM會將該線程放入“等待池”中。 進入該狀態后,無法自動喚醒,必須依賴其他線程調用()或()方法才能被喚醒。
(2)同步阻塞:當運行的線程獲取對象的同步鎖時,如果同步鎖被其他線程占用,JVM就會將該線程放入“鎖池”中。
(3)其他阻塞:當正在運行的線程執行sleep()或join()方法時,或者發出I/O請求時,JVM會將線程置于阻塞狀態。 當sleep()狀態超時時,join()等待線程終止或超時,或者當I/O處理完成時,線程再次轉入就緒狀態。
5、死亡狀態(Dead):線程執行完畢或因異常退出run()方法,線程結束生命周期。
41.獲取Class對象的三種方法是什么?
第一種方式:
不帶new,根據類的class屬性獲取Class對象(類名.class)
第二種方式:
new的情況下,通過.()方法獲取Class對象
第三種方式:
通過Class.("包名+類名")方法獲取Class對象
42.什么是反射?
Java反射是指在運行狀態下,對于任何一個類,都可以知道這個類的所有屬性和方法; 對于任何對象,您可以調用它的任何方法和屬性; 并且您可以更改其屬性。
反映()機制
它可以動態獲取類的信息,動態調用對象的方法。
反射機制主要提供以下功能
在運行時確定任何對象的類。
在運行時構造任何類的對象。
在運行時確定任何類的成員變量和方法。
在運行時調用對象的任何方法。
對反射的理解:
1、通常我們創建對象的時候都是通過New class來創建的,但是通過反射技術,我們可以通過Class來創建實例。 (類的完整路徑),例如:加載JDBC驅動程序時,我們使用反射技術。
2.反射主要用于平時開發中框架層的開發。 例如,框架內部使用反射技術來創建實例。
43.工廠模式和單例模式?
單例模式:應用該模式的類只能有一個實例。 它必須自己創建這個實例,它必須將這個實例提供給整個系統本身。 從具體實現來看:首先,單例類只提供了私有構造函數; 其次,類定義包含該類的靜態對象私有對象; 第三,類提供靜態公共函數用于創建或獲取自身的靜態私有對象。
工廠模式:簡單來說,對象的創建傳統上都是交給工廠類來創建,然后通過工廠類的工廠方法可以自己獲取對象。 適用場景是對象創建步驟繁瑣,過程相對復雜。
工廠模式和單例模式的區別:
區別一:工廠模式可以創建不同類型的對象實例,而單例模式只能創建一種類型的對象實例;
區別二:工廠模式創建的對象實例沒有在內存中只創建一份的要求,而單例模式創建的對象實例在內存中只有一份。