---
# System prepended metadata

title: WEEK 1  8/17~8/21 彙整

---

# 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 不同陣列，但儲存資料為同一個記憶體位址，
      修改其中一個內容，另外一個也會跟著被改，因為是共用記憶體位址 

   
   