之前沒學過Java,因工作需要開始學習Java| react| vue 全棧開發,fighting!!
學習資料「Java開發實戰經典」、「Java編程思想」、「React學習手冊」。
小白也想變的很厲害!!
記錄一下Java注意事項和學習盲點:
- 修飾符:修飾符,可選,告訴編譯器如何調用該方法。定義了該方法的訪問類型。
- 返回值類型 :方法可能會返回值。returnValueType 是方法返回值的數據類型。有些方法執行所需的操作,但沒有返回值。在這種情況下,returnValueType 是關鍵字void。
- 方法名:是方法的實際名稱。方法名和參數表共同構成方法簽名。
- 參數類型:參數像是一個占位符。當方法被調用時,傳遞值給參數。這個值被稱為實參或變量。參數列表是指方法的參數類型、順序和參數的個數。參數是可選的,方法可以不包含任何參數。
- 方法體:方法體包含具體的語句,定義該方法的功能。
Java面向對象的三個特性:
(1)封裝性 類的屬性封裝。e.g. private;(2)繼承性;(3)多態性。多態包括方法重載和對象多態。
- 方法重載:方法名稱相同,只是參數類型、個數不同。e.g. 最常用的重載方法 System.out.println(),因為這個方法可以打印任意類型的數據。
- 對象多態:子類對象可以和父類對象相互轉換,根據使用子類的對象不同,完成的功能也不同。
定義Java類時,單詞的首字母必須大寫。對象使用前必須實例化
構造方法:(1)其名稱必須與類名一致。(2)其聲明處不能有任何返回值類型的聲明。(3)不能在構造方法中使用return返回一個值。
String
String中使用“==”是用來進行地址值比較的,而不是直接比較字符串內容是否相等,如果要比較字符串內容/地址是否相等,需要使用eauals()方法。
String實例化的方式:
(1)直接賦值:只要是以后聲明的字符串內容相同,則都不會再開辟新的內存空間【內容重復時,會將對象指向已經存在的地址】
(2)使用標准的new調用方法:無論如何 都會開辟一個新空間。
字符串的內容不可改變,改的實際是堆內存地址的指向。
this關鍵字 作用:(1)表示類的屬性(2)使用this調用本類的構造方法(3)表示當前對象。
代碼塊:靜態代碼塊優先於主方法執行,而在類中定義的靜態代碼塊會優先於構造塊執行,而且不管有多少個對象產生,靜態代碼塊只執行一次。
繼承: e.g. extends
只允許單繼承(多層繼承),不能使用多重繼承。意思就是,只能有一個爸爸,但是爸爸還能有爸爸,即爺爺(多層繼承)。不可以有多個同級別爸爸(多重繼承)。
子類不能直接訪問父類中的私有屬性,可通過setter或者getter方法調用訪問;子類可以調用父類中的非私有方法,但是不能直接調用父類中的私有成員。
子類對象在實例化前會先默認調用父類中的構造方法,在實例化子類對象前需要先將父類中的屬性進行初始化,實際上在子類的構造方法中隱含了一個super()的語法。
子類的方法覆寫,權限不能更高,權限關系 private < default < public.
方法的重載overloading和覆寫/重寫overriding是很像的
重載:方法名相同,參數類型/個數不同,權限沒要求,在一個類里。
覆寫/重寫:方法名相同;參數類型/返回值可以不相同,但必須是父類返回值的派生類;被覆寫的方法不能有更嚴格的權限,發生在繼承類中。
重載原則補充:
- 被重載的方法可以改變返回類型;
- 被重載的方法可以改變訪問修飾符;
- 被重載的方法可以聲明新的或更廣的檢查異常;
- 方法能夠在同一個類中或者在一個子類中被重載。
- 無法以返回值類型作為重載函數的區分標准。
覆寫/重寫原則補充:
-
訪問權限不能比父類中被重寫的方法的訪問權限更低。例如:如果父類的一個方法被聲明為 public,那么在子類中重寫該方法就不能聲明為 protected。
-
父類的成員方法只能被它的子類重寫。
-
聲明為 final 的方法不能被重寫。
-
聲明為 static 的方法不能被重寫,但是能夠被再次聲明。
-
子類和父類在同一個包中,那么子類可以重寫父類所有方法,除了聲明為 private 和 final 的方法。
-
子類和父類不在同一個包中,那么子類只能夠重寫父類的聲明為 public 和 protected 的非 final 方法。
-
重寫的方法能夠拋出任何非強制異常,無論被重寫的方法是否拋出異常。但是,重寫的方法不能拋出新的強制性異常,或者比被重寫方法聲明的更廣泛的強制性異常,反之則可以。
-
構造方法不能被重寫。
方法的重寫(Overriding)和重載(Overloading)是java多態性的不同表現,重寫是父類與子類之間多態性的一種表現,重載可以理解成多態的具體表現形式。
- (1)方法重載是一個類中定義了多個方法名相同,而他們的參數的數量不同或數量相同而類型和次序不同,則稱為方法的重載(Overloading)。
- (2)方法重寫是在子類存在方法與父類的方法的名字相同,而且參數的個數與類型一樣,返回值也一樣的方法,就稱為重寫(Overriding)。
- (3)方法重載是一個類的多態性表現,而方法重寫是子類與父類的一種多態性表現。
this和super也是很像的 區別在於this先訪問本類中的方法,如果沒有,從父類中查找。super是直接訪問父類中的屬性/方法
final(1)final聲明的類不能有子類(2)final聲明的方法不能被子類所覆寫(3)final聲明的變量即成為常量,常量不能修改。使用final聲明變量時,要求全部的字母大寫。
abstract 抽象類 抽象方法不要使用private聲明。原因是abstract抽象方法必須被子類覆寫,而使用private聲明的話,是無法子類覆寫的。
interface 接口
interface 接口名稱{
全局常量;
抽象方法;
}
接口中的抽象方法必須是public訪問權限,可省略寫。
子類通過implements關鍵字實現接口,e.g. class 子類 implements 接口A,接口B... { }
子類可既要實現接口又要繼承抽象類,e.g. class 子類 extends 抽象類 implements 接口A,接口B... { }
一個抽象類中可以定義多個接口或者抽象類,在一個接口中也可以定義多個抽象類或者接口。在抽象類中可以定義多個內部抽象類,在接口中可以定義多個內部接口。
在類的設計中,一定要明確一個原則,一個類不要去繼承一個已經實現好的類,只能繼承抽象類或實現接口,如果接口和抽象類都可以使用,那么優先使用接口,避免單繼承局限。
對象轉型:
對象向上轉型:父類 父類對象 = 子類實例; e.g. Object obj = a;
對象向下轉型:子類 子類對象 = (子類)父類實例 e.g. A x = (A)obj; A是接口
在進行對象的向下轉型前,必須首先發生對象向上轉型
多態性
多態的優點
1. 消除類型之間的耦合關系;2. 可替換性;3. 可擴充性;4. 接口性;5. 靈活性;6. 簡化性
多態存在的三個必要條件:繼承;重寫;父類引用指向子類對象
多態方式一:重寫;方式二:接口;方式三:抽象類和抽象方法
instanceof: 關鍵字判斷對象是哪個類的實例
在進行字符串判斷時常把字符串常量寫在前面是因為這樣可以避免空指向異常。
設計模式:
(1)工廠設計:接口對象的實例是通過工廠取得的,這樣以后如果再有子類擴充,直接修改工廠類客戶端就可以根據標記得到相應的實例,靈活性比較高。
(2)代理設計:【類似 網絡的代理】 e.g. 三角關系 用戶上網
代理----------------->真實
(3)適配器設計:【中間過度 a-->b-->c】圖形界面編程的事件處理中經常使用此設計模式
Object類:
在Java中所有類都有個一個公共的父類object,一個類只要沒有明顯的繼承,那么肯定是object類的子類。
最好覆寫object類中的equals()、hashCode()、toString()
包裝類 e.g. Integer、Character、Short、Long、Float、Double、Boolean、Byte
裝箱與拆箱 裝箱將一個基本數據類型變成包裝類,而將一個包裝類變成基本數據類型的過程為拆箱
異常的捕獲及處理 標准是 try-catch-final,實際上可以不寫catch語法,可以直接使用System.out.println(異常對象);或者e.printStackTrace();
try{
// 有可能出現異常的語句
}catch(異常類 異常對象){
//編寫異常的處理語句
}catch(異常類 異常對象){
//編寫異常的處理語句
}
finally{
//一定會運行到的code
}
throws關鍵字 使用該聲明的方法表示此方法不處理異常,而交給方法的調用處進行處理
不要在主方法中使用throws。雖然在主方法處使用throws關鍵字,在程序主方法中就可以不再使用try...catch語句進行異常的捕獲及處理。但是程序出現問題后肯定交給JVM進行處理,將導致程序中斷。
throw 人為拋出異常,拋出時直接拋出異常類的實例化對象即可。throw不會單獨使用。
assert 斷言 Java設計時考慮系統應用 為了避免某些用戶使用assert作為關鍵字,所以正常運行時斷言不會起任何作用,如果要起作用,Java運行時應加參數 -ea (全稱:enableassertions) e.g. javac Test.java java -ea Test
包 package 多人協作
運行時 e.g. javaac -d classname.java //-d表示生成目錄
java packagename.classname //執行類時輸入完整的“包.類名稱”
import 包的導入
import 包名稱.子包名稱.類名稱; //手工導入需要的類
import 包名稱.子包名稱.*; //由JVM自動加載所需要的類
如果一個類要被外包訪問,則此類一定要定義成public class。如果在一個程序中同時導入了兩個包的同名類,在使用時就必須明確地寫出完整的“包.類名稱”
如果一個類的所有方法都是使用static聲明,則導入時就可以直接使用import static的方式導入。
Java命名規范:
類:所有單詞的首字母大寫 e.g. TestJava
方法:第一個單詞首字母小寫,之后每個單詞首字母大寫 e.g. getInfo()
屬性:第一個單詞首字母小寫,之后每個單詞首字母大寫 e.g. studentName
包:所有單詞的字母小寫 e.g. org.xx.demo
常量:所有單詞的字母大寫 e.g. FLAG