前言
這是推薦學java
系列的第三篇,這節的內容很多,對於小白來說,都是新概念,要熟練掌握的話,需要大量的練習。本節內容的導圖會很大,小編會在講解每個知識點之前單獨提供導圖,當然全圖也有,除此之外,這節內容會涉及很多系統的API,而我們要學會看 jdk 文檔,所以也會給大家提供 jdk1.8 的幫助文檔,下載見文末。
有圖有真相就不多說了,知識點基本是上一篇的兩倍。
設計模式
Java中的 23 種設計模式在開發中應用很多,不僅僅是我們平時的應用開發,還包括一些框架和系統源碼中都有應用,具體的內容不能生搬硬套,而是在經驗中去體會這個過程,思考應用設計模式的時機和場景。
其中單例設計模式最常用,也最簡單,幾乎可以說但凡用Java語言開發的程序,都會用到單例設計模式。沒有必要死磕概念,重要的是理解其思想,隨着開發經驗的累積,就會慢慢體悟到其中的奧妙!
/**
* 懶漢式
*/
public class SingletonLazy {
private static SingletonLazy singletonHungry;
private SingletonLazy() {
}
public static SingletonLazy getInstance() {
if (singletonHungry == null) {
singletonHungry = new SingletonLazy();
}
return singletonHungry;
}
}
/**
* 餓漢式
*/
public class SingletonHungry {
private static SingletonHungry singletonHungry = new SingletonHungry();
private SingletonHungry() {
}
public static SingletonHungry getInstance() {
return singletonHungry;
}
}
多態
多態
是 Java 面向對象中的三大特點之一,上一篇中講了 封裝
和 繼承
,多態是本節的第一重點內容。其要表達的意思簡而言之:一種事務的多種形態展現形式就叫多態。
抽象起來不好理解,舉例實際場景比較好理解:
比如我們軟件開發者本身就是抽象一類,因爲其他行業的人理解起來就不容易,而且還分不清楚,你到底是開發啥的?(是前端開發還是後端開發?是Java開發還是PHP開發?是系統層開發還是遊戲開發?等等),這個概念總體給人是一種抽象的,但還大概知道這個詞具有哪些 共性 ,而這裏的
共性
就是抽象出來的具體能力,Java中叫抽象方法,因爲每個具體的開發者所具有的同一個方法內部能力表現不同,這就是具體子類要實現的。這裏的子類可以理解爲java開發工程師
、PHP開發工程師
等等。
在我們實際開發中,根據業務場景,我們要自己去提取抽象類,進而實現分離的能力,而所分離出來的多個子類,具有不同的表現形式,就是多種形態的,故名 多態
。
關鍵字 instanceof
相信你能明白,我們抽離出來了抽象類(父類),那麼子類的表現各異,而父類如何判斷一個子類是否是它的子類呢?這就是關鍵字 instanceof
的用處。
學習多態可能聽到最多的一句話就是:父類引用指向子類對象。
什麼叫引用,老版本教材中叫做句柄
,新點的教程都稱爲 引用
,其實就是創建的對象的變量,比如:
// programmer 就是句柄,也叫引用
Programmer programmer = new Programmer();
再舉個父類引用指向子類對象的例子:
// new 是用來創建對象的,上一節大家都用過
Programmer javaProgrammer = new JavaProgrammer();
interface
這塊內容大家看導圖,記住用法和爲什麼用。實際開發中,定義接口的場景太多了,必須熟練掌握使用規則。
小結
多態
的內容是重中之重,必須搞明白下面這幾個概念和爲什麼?這也是常見的面試題。
- Java中的多態你是怎麼理解的?
- 你對抽象類怎麼理解?抽象類有什麼特點?
- Java爲什麼會有接口(interface)?
- 接口的使用規則和接口中方法的定義
- 內部類的應用場景?
異常
這塊內容現在開發中依靠 IDE 的只能提示已經可以搞定了,更多的應用情況是自己開發SDK或者封裝組件時候的處理,明確出現異常時,程序的執行順序,以及父類方法拋出異常,子類重寫時拋異常的規則。
包裝類
- 明確爲什麼要有包裝類?
- 熟練掌握裝箱與拆箱的規則和類型轉換方法的使用
導圖中提到的轉換方法,開發中經常用到,大家要多練習,最起碼基本數據類型要全部嘗試一次。
以下代碼是本節的重點:
private static void compareDemo() {
Integer num1 = 20;
/**
* 相當於執行了 Integer num2 = Integer.valueOf(2021);
*
* Double 和 Float 不具備這個特性(常量池)
*/
Integer num2 = 2021;
Integer num3 = 20;
Integer num4 = 2021;
System.out.println("num1 與 20 相等嗎 " + (num1 == 20));
// 自動拆箱比較
System.out.println("num2 與 2021 相等嗎 " + (num2 == 2021));
/**
* 結果不同的原因:Integer在 -128~127 之間時,參與兩個 Integer 對象比較前會自動拆箱,超過這個範圍則不會
*/
System.out.println("num1 與 num3 相等嗎 " + (num1 == num3)); // 30 數字在比較
System.out.println("num2 與 num4 相等嗎 " + (num2 == num4)); // 對象在比較
}
字符串
這部分內容每個Java開發者必須熟練掌握,字符串的截取、替換、匹配、大小寫轉換、查找、拼接等是最最常用的操作,導圖中列出來的方法必須熟練運用。
集合
導圖中的重點內容都有標記,是屬於重中之重,Java中的集合內容也是面試問的最多的知識點之一,必須牢記於心,熟練運用。ArrayList
和 HashMap
是開發中最常用到的集合,必須要明白它們各自的特點和常用方法以及特有方法,大多數場景是兩者結合來使用,比如:條件過濾操作等。
線程
首先要搞清楚程序執行的默認順序和主線程之間的關係;其次要明白當有多個線程的時候,程序又是如何執行的;這兩個問題搞清楚後,你就會明白什麼時候需要創建線程了。
知識點(同樣是面試題):
- 創建線程的方式
- 線程的執行順序
- 對synchronized關鍵字的理解
- 線程死鎖問題
IO
這部分內容實際開發中與網絡請求結合使用,比如下載文件、上傳文件、修改頭像等,這裏的具體API使用都是最原生的,也就是底層實現邏輯是這樣的,往往實際開發中我們會使用別人封裝的框架,看不到最裏面的API實現,框架會暴漏給我們一些方法,也許就是一句話就實現了下載或者上傳;但是有些場景還是需要我們手動擼一遍,所以這些原理的核心代碼還是要掌握,偶爾面試也會讓你口述流程。
以下代碼是關於 File
類創建文件的三種方式,根據業務都有可能會用到:
/**
* 創建文件 File 的幾種方式
*
* @param parentPath 前端路徑
* @param fileNamePath 後端路徑
*/
private static void createFile(String parentPath, String fileNamePath) {
File file1 = new File(parentPath + "\\" + fileNamePath);
System.out.println("file1 is exit ? " + file1.exists());
File file2 = new File(parentPath, fileNamePath);
System.out.println("file2 is exit ? " + file2.exists());
File file3 = new File(new File(parentPath), fileNamePath);
System.out.println("file3 is exit ? " + file3.exists());
}
總結
jdk1.8 幫助文檔下載:https://pan.baidu.com/s/12JHAlmwZbtBiJlPNZPlf3Q
取密碼:d5ya(這個文檔是小編從網上下的,裏面如有其他內容請勿相信哈)
這三篇內容,對於小白建議15天學完,必須穩紮穩打,這就是Java最基礎的東西,不管是後面要接觸的多麼牛逼的框架,底層都離不開基礎的支撐。
補充內容:Java中的枚舉(Enum)
相對比較簡單,自行搜索熟悉寫法,後續的項目篇章就會應用。
小編特意創建了一個號:
推薦學java
,會分享與java
相關的內容,並且以原創爲主,歡迎大家搜索關注(關注即送小編挑選的精品視頻教程),一起學Java!