# 資料型態的轉換

資料型態的轉換可分為「自動型態轉換」及「強制型態轉換」。

### 一、自動型態轉換

* 轉換前的資料型態與轉換後的型態相容
* 轉換後的資料型態之表示範圍比轉換前的型態大
* 型態的轉換只限該行敘述，不影響原先變數的型態定義
* 保證資料的精確度
* 這種轉換方式稱為「擴大轉換」

字元與整數可以使用自動型態轉換；整數與浮點數亦相容；

boolean 布林型態只能存放 true 或 false，因此與整數及字元不相容，不能轉換。

```
package ch03;

public class ch03_4_4 {

	public static void main(String[] args) {
		int a=45;
		float b=2.3f;

		System.out.println("a= "+a+" ,b= "+b);
		System.out.println("a/b= "+(a/b));

	}

}

```

OUTPUT：\
a= 45 ,b= 2.3\
a/b= 19.565218

{% hint style="info" %}
當兩個數值中有一個為浮點數時，運算結果會直接轉換為浮點數。

**當運算式中變數的型態不同時，會自動把較少的表示範圍轉換成較大的表示範圍後再做運算。**
{% endhint %}

### 二、強制型態轉換

強制型態轉換是直接撰寫在程式碼中，所以也稱為「顯性轉換」。

> 資料型態的強制性轉換語法：
>
> ```
> （欲轉換的資料型態）變數名稱 ;
> ```

```
package ch03;

public class ch03_4_5 {

	public static void main(String[] args) {
		int a=25;
		int b=9;

		System.out.println("a= "+a+ ",b= "+b);
		System.out.println("a/b= "+a/b);

                // 將a轉換成浮點數之後，再除以b
		System.out.println("(float)a/b= "+(float)a/b);

	}

}

```

OUTPUT：\
a= 25,b= 9\
a/b= 2\
(float)a/b= 2.7777777

> 除了 (float)a/b 的寫法之外，以下兩種寫法也成立：
>
> (1)  a / (float) b   //將整數b強制轉換成浮點數，再以整數a除之。
>
> (2)  (float) a / (float) b  //將整數a,b 同時強制轉換成浮點數後運算。

{% hint style="info" %}
若是將一個能表示較大範圍之資料型態的變數，設給範圍較小之資料型態的變數時，稱為「縮小轉換」。

在縮小轉換的過程可能會漏失資料的準確性。
{% endhint %}

### 三、由鍵盤輸入資料 Scanner

我們先了解撰寫的基本架構：

```
import java.util.Scanner;
public class class_name   //類別名稱
{
	public static void main(String[] args)
        {
	   	Scanner 物件名稱=new Scnner (System.in); //宣告 Scanner 類別的變數
		資料型態 變數名稱 a;                      //宣告變數
                ... ...
		變數名稱=物件名稱.相對應型態的Scanner 類別函數; //讀入資料至變數
		... ...

	}

}
```

以下我們實例，並結合先前講到的print與println的差異：

```
package ch03;

import java.util.Scanner;

public class ch03_5 {

	public static void main(String[] args) {
		Scanner sc=new Scanner (System.in);  //宣告 Scanner 類別的物件名為：sc
		System.out.print("請輸入姓名");
		String str;                          //宣告變數str
                str=sc.nextLine();                   //輸入字串，給str存放
		System.out.println("歡迎 "+str);

	}

}

```

OUTPUT：\
請輸入姓名 ***4x***   // ***斜線粗體***&#x70BA;輸入的字串\
歡迎 4x

{% hint style="info" %}
在使用Scanner 類別時，我們必須先建立Scanner 類別的物件，再利用所建立的物件呼叫相對應的函數。
{% endhint %}

常用的相對應型態之函數

| 資料型態 | 相對應的函數 | 資料型態 | 相對應的函數 |
| ---- | ------ | ---- | ------ |

| byte | nextByte() | float | nextFloat() |
| ---- | ---------- | ----- | ----------- |

| short | nextShort() | double | nextDouble() |
| ----- | ----------- | ------ | ------------ |

| int | nextInt() | String | next() |
| --- | --------- | ------ | ------ |

| long | nextLong() | nextLine() |
| ---- | ---------- | ---------- |

### 四、Scanner 小技巧

輸入多項資料時，可以只宣告一個Scanner 類別的物件，再用Scanner 類別提供的成員函數，將鍵盤中輸入的資料指定給不同型態的變數存放，不需要宣告多個Scanner 類別物件。\
如以下片段範例：

```
Ssanner scn=new Scanner(System.in);  //宣告Scanner類別的物件
int i;                               //宣告整數變數
double d;                            //宣告倍精度浮點數
i=scn.nextInt();                     //輸入整數數值，給i存放
d=scn.nextDouble();                  //輸入倍精度浮點數數值，給d存放
```

### 五、next()與nextLine()

{% hint style="info" %}
在輸入字串時，可以使用 next() 或 nextLine() 函數，由於Scanner 物件遇到空白字元即會傳回空白字元之前的資料，因此若是字串中不確定會帶有空白字元的情況下，建議使用 nextLine()，反則輸入的資料將被截斷
{% endhint %}

```
package ch03;
import java.util.Scanner;
public class ch03_5_2 {

	public static void main(String[] args) {
		Scanner scn=new Scanner (System.in);  //宣告 Scanner 類別的物件名為：scn
		String name;
		int age;

		System.out.print("請輸入姓名");
		name=scn.nextLine();                   //輸入字串，給name存放

                System.out.print("請輸入年齡");
                age=scn.nextInt();                   //輸入整數，給age存放

		System.out.print("歡迎， "+name+"， 您目前 ");
		System.out.println(age+" 歲。");

	}

}
```

OUTPUT：\
請輸入姓&#x540D;***scheng***  // ***斜線粗體***&#x70BA;輸入的字串\
請輸入年&#x9F61;***19***\
歡迎， scheng， 您目前 19 歲。

### 六、charAt()

{% hint style="info" %}
Scanner類別並沒有提供字元輸入相對應型態的函數，可以利用 next() 取得字串後，再利用 charAt(0) 取出字串中第0個字元即可得到字元。
{% endhint %}

```
package ch03;
import java.util.Scanner;
public class ch03_5_3 {

	public static void main(String[] args) {
		Scanner scn=new Scanner (System.in);  //宣告 Scanner 類別的物件名為：scn

		System.out.print("請輸入姓名");
		String str;                          //宣告變數str
                str=scn.nextLine();                  //輸入字串，給str存放

                char ch;
                ch=str.charAt(2);                    //取出字串第2個字元
                System.out.print(ch);                //印出第二個字元

	}

}
```

OUTPUT： \
請輸入姓&#x540D;***scheng*** // ***斜線粗體***&#x70BA;輸入的字串 \
h //第0個字元為 ‘s’ ；第1個字元為 ‘c’ 以此類推。
