一、流程分支
If/else :基於boolean值的雙分支
Switch:基於數字(整數、char、byte、枚舉)、字符串
類型的多分支
Int month =5;
Switch
二、方法method
1.方法就是一個子程序
Java中方法的命名規范是駝峰命名法。
int add( int a, int b ){
int result = a + b;
return result;
}
float add( float a, float b){
float result = a + b;
return result;
}
2.方法也是有類型的
對於方法的使用者來說,返回值就是方法的類型
對於重載來說,方法簽名就是其類型
方法簽名:方法的名字+參數類型(多個,順序嚴格的)
方法的返回值類型不屬於簽名的一部分
//這兩個方法的方法簽名相同,因此傳的參數不知道調用哪一個方法,無法確定返回類型。
int add( int a, int b ){
int result = a + b;
return result;
}
float add( int a, int b ){
int result = a + b;
return result;
}
簽名不同才能重載!!
Tips:
1>對於java8中的拉姆達表達式來說,方法的類型包括
返回值類型->(參數類型<多個,順序嚴格的>)
2>方法的返回值有一個特殊的類型void,、
沒有返回值,也就是方法中沒有return語句
3>方法的參數傳遞時有2種傳值形式,實際是由參數的類型的性質決定的。
基本類型:按值傳遞,把值復制到方法中
引用類型:只是傳遞對象的引用,如果在方法中改變了對象(內部屬性),就會影響這個對象
4>方法(包括面向對象)都不是必須的!方法和面向對象都是給程序設計人員使用的。所以寫代碼時,如果要定義方法,就是站在設計師的高度去完成方法的設計。
3.設計的必要性:
設計師有必要的(有利於提升質量、可維護性、效率、重用),但是設計是無止境的,適可而止。評價設計優劣的標准:簡化、不用重復(消除重復代碼)
4.提取方法,將功能只能分散
如果一個方法代碼太多,指責太多,則表示需要對這個方法進行重構(Rafactor)。通常會使用提取方法的功能智能進行分散
IDE(Ecllipse)對此提供非常好的支持
舉例:單位轉換程序,所以的代碼都可以寫在main方法中。但是將調度職責和具體的轉換職責進行拆分,將會使程序結構更加清晰。整個程序也會更加簡單。
public Class UnitClac{
//交互邏輯
static void main(String[] args){
//進行轉換調度
}
//業務邏輯
static void c2f(Scannerscanner){
//將攝氏度轉換為華氏度
}
static void f2c(Scannerscanner){
//將華氏度轉換為攝氏度
}
}
任何應用都由應用交互邏輯和業務邏輯2部分構成。
交互邏輯可以隨意改變,而且經常會隨技術和流行趨勢變化。
業務邏輯相對穩定。
交互邏輯通常圍繞UI展開。
業務員邏輯通常圍繞數據展開
具體來說就是收集數據、存儲、分析、展示數據。
Static (靜態的)方法沒有充分體現面向對象的特征。
對於static方法來說,類只是一個盒子(容器),static方法與對象(實例)關系不大。
三、程序調試
通過調試可以觀察程序的執行過程和內部數據
調試是一個非常強大的能力(斷點和單步執行是由CPU和JVM聯合支持的)
通過“蟲子”圖標可以進入調試模式,如果沒有看到調試視圖,可以在右上角進行透視圖的切換
加斷點:讓程序停留在斷點的位置
單步執行:F5/F6
F5:進入方法
F6:越過方法
四、調用棧
先入后出
棧是一個只有一個口的容器,先進入棧的會落到棧底,出棧的時候最后出。最后進入棧的,在棧頂,出棧時先出。
方法調用時,需要在內存中開辟一塊存儲空間做為線程棧空間
每個線程都由自己的棧
調用方法時,會在棧中壓入一個棧幀,用來存儲這個方法的參數和局部變量
方法返回時 ,棧幀就會彈出,方法的參數和局部變量就會清除
方法調用時,調用棧不斷處於漲落之中
如果調用的層級過深,調用棧可能會溢出
因為代碼執行的速度很快,所以棧幀的生存時間很短,瞬間生滅
所以局部變量無法被外部使用
五、異常處理
程序執行時,遇到錯誤(調用棧中的錯誤)就會停止執行,如果錯誤數據不能清除掉,程序就無法恢復,最終崩潰。
而java等現代編程語言普遍提高了清理錯誤數據的機制
異常處理
早期的c語言沒有異常處理機制
在java中,有一類異常很特別,它們叫做受查異常
受查異常必須傳遞出去(thows)或者處理掉(try/catch),不能不管
try(){
}
當代碼執行到try時,會建立一個安全點,一旦在try中發生錯誤
JVM就會檢查並收集錯誤信息(錯誤的原因、錯誤的位置、當前調用棧的結構等)
然后利用這些信息創建一個Exception對象(類型取決於錯誤原因)
然后拋出(throw)這個異常對象
異常對象的傳播當異常被拋出throw之后,JVM會沿着調用棧從上往下逐幀查找try建立的安全點,直到找到一個符合條件的catch或者到達棧底(崩潰)
Catch (SomeTypeException ex){
//清理
//異常對象的使用
}
//從這里繼續執行
異常的catch
Catch是一個匹配的過程,只有類型匹配成功,才會接受(捕獲),否則繼續沿着調用棧查找。
當異常被處理后,上面的棧幀就會被清除
如果在錯誤之前打開了一個系統資源,則該資源就有可能沒有正確地關閉,所有try catch后面可以寫finally{ }
finally一定會被調用,可以用來關閉資源。
異常對象中包含的信息可以通過異常對象提供的方法獲取到
getMessage()
getStackTrace()
printStackTracd() 可以把異常信息打印到控制台或指定的輸出流中(保存成文件等)
作業:
1.畫一個調用棧來表示多層方法調用的過程
static void main(){
double a = 3;
double b =5;
double c = calcArc(3,5)
}
static double calcArc(double x, double y){
double m = pow(x);-+
double n = pow(y);
double 0 = m+n;
return sqrt(o);
}
2.Square類 a邊長
Rectangle類 a,b長寬
Circle 類 r半徑
Sidelength()周長
3.畫一個異常傳播的示意圖