# WEEK 1 8/17~8/21 彙整 ## 主要內容:陣列1維及多維,基礎函式,運算子順序,三元運算寫法 ### 了解基礎 記憶體位置 * 變數初始值 或設定為null 在java中 實際值為0 * 參考變數(arr[0]) 初始為null * 部分(arr)會顯示為 型態+記憶體位置 ```java= Scanner sc = new Scanner(System.in); //在heap配置了Scanner,位址存於stack內的sc內 Scanner[] arr = new Scanner[5]; //在heap配置 5個Scanner的類別用來存scanner的位置 arr[0] = sc; //將位於stack的sc的值,儲存到位於heap內的arr[0]的位置 ``` * 二維陣列 * 第一階在stack 存位址,實際陣列位於heap * 位於heap的陣列,儲存第二維的位置,資料位於另外的heap位址 ```java= int[][] arr = new int[3][3]; arr[0]=arr[1]; //將arr[1]內存的"位址",儲存到arr[0]內 arr[0][0] = 1; //此時 arr[1][0] 是同一個記憶體位置內存值 arr[0][1] = 2; //此時 arr[1][1] 是同一個記憶體位置內存值 java可動態調整array長度!! int[][] arr = new int[3][]; for(int i=0;i<3;i++){ arr[i] = new int[i+1]; //創建不同長度的第二階陣列 for(int j=0;j<i+1;j++){ arr[i][j]=j+1; //賦值 } } for(int i=0;i<3;i++){ for(int j=0;j<i+1;j++){ System.out.println(arr[i][j]); //印出 } } ``` * 長度不同的矩陣長度列印 ```java= int[][] arr = { {1,2,3},{4,5}}; for(int i=0;i<arr.length;i++){ for(int j=0;j<arr[i].length;j++){ //執行動作 } } ``` --- ### 運算子++ 跟- - 的先後順序 運算 等號右邊先算 再放入左值 優先順序 1.從左到右 2.遇到括弧 先算 ```java= 1.int a=4, b=3; a= (a++ -b)*a; ``` 先運算等號 右邊第一個a++ 為後++ 本質不變但下一個出現的a 因為暫存值(a++變為5) 故(4-3)*5 =5 /////////////////////////////////////////////// ```java= 1.int a=4, b=3; a= (a* ++b)/--a; ``` ++ b為先++ --a為先-- 故 從左到右 (4*4)/3 =5.xxxx a為int故為5 ```java= 1.int a=4, b=3; a= ((--a *b++)/ (a* --b)); ``` 3*3 b++(暫存為4) /3*3 (又被- -b扣掉) =1 --- ## 三元運算子 寫法 接收的數值 =(判斷true or false的結果) ? true(會傳的數值) : false (會傳的數值); 三個數值都一樣 ex int a = (true) ? int b : int c; 這樣a會等於b --- ## foreach寫法 ```java= int[] arr ={1,2,3,4}; for(int i : arr){ ...... //他就會從arr第一位取到最後一位 不斷放入變數 i中 一直到重覆到陣列長度 } ``` --- ## 函式 變數 及 行為 main 主程式的開始 函式主要是一個方法 例如: int a =sc.nextInt(); 用. 進入nextInt 方法用完後將回傳值帶回給sc 然後放入int a裡面 用上void 後 將不會有回傳值 void位置 可以用其他型態取代位置例如 int double ...等 而他的後面 放 自己取的名稱 例如 public static void abc(){ } () 裡面用, 做區隔 裡面可放任何型態(參考資料 基本資料) 可以一樣也可以不一樣 例如 public static void abc(int test1,int test2){ } 如果不是void 是其他型態例如 public static int abc(int a){ return 1; //要有回傳值(要注意回傳型態是否相同) } 函式的(int a) 是指這個函式方法被創立的時候新建的 int a; 當離開這個方法時,他生命週期就結束了 跟main裡面的 int a 是不同個位置 ```java= public class Main{ public static void main(String[] args){ Scanner sc = new Scanner(System.in); test();//執行下方函式(方法) } public static void/*方法的回傳值*/ test() /*方法名稱(型態 參數1名稱,型態 參數2名稱)*/ { System.out.println("!") } ``` * 回傳值 只能選一個型態(例如選了int 就不能回傳double)或不傳(viod) * 傳入值 可以很多個各種不同型態 * 函式運作思路 : main主程式內跟函式是不同記憶空間,並不相連 要藉由傳入值 傳進函式 及 回傳值(return) 才能將資料給予彼此對方 * main函式內變數,與函式內可重複名稱,因函式內的名稱生命週期,僅在該函式內。 --- java 僅 call by value 另有 call by reference 及 call by address(限台灣) ```java= public class Main{ public static void main(String[] args){ //Scanner sc = new Scanner(System.in); int a = 5; test(a);//執行下方函式(方法) System.out.println(a); //外部 a 未被變更 印出5 int[] b = new int[1]; b[0]=5; System.out.println(b[0]); //位址指向的 b[0]資料被變更 印出1 } /*下方的函式 int a , int[] b*/ public static void test(int a,int[] b){ a += 1; b[0]=1; } ``` * 目前唯一有辦法不回傳值,修改到內容,只能從地址修改 假設有int[] a,int[] b 不同陣列,但儲存資料為同一個記憶體位址, 修改其中一個內容,另外一個也會跟著被改,因為是共用記憶體位址