# 數據類型
[TOC]
## 概述
Java 是一種強數據類型的語言,就是指在變量進行定義的時候,就指定了變量的數據類型是什么。
**變量的概念:把一堆數據起了個名字。**
數據類型其實就是在內存中用不同的結構對數據進行存儲和運算。
>[warning]內存:運行中的程序都會占用內存空間,因為程序在運行過程中,需要開辟包括方法棧區、變量....,廣泛的理解,在程序運行結束后內存空間會被釋放,但是定義的變量、方法等,都是有「生命周期」的,一旦變量銷毀了,內存也是會釋放的。**
在 Java 中,有垃圾自動回收機制 GC ,對于釋放的或者無效的變量會自動回收,不像 C 、C++ 要手動的去釋放。
## 數據類型的分類
### 基本數據類型
* 數值型
* 整數型:byte(-128-127)、short(15次方)、int(31次方)、long(63次方)
* 浮點型:float(38次方)、double(308次方)
* **在實際開發中,我們一般使用 int、double**
* 字符型
* char:用單引號表示,Java 中使用16位的 Unicode 字符集作為編碼方式,
* 表示方式
* 直接通過單個字符表示:'a'、‘9' 等;
* 通過轉義字符表示:'\\t'、'\\n'、'\\r'、'\\'';
* 直接使用 unicode 表示:'\\uxxxx'。
* 布爾型
* boolean:表示邏輯中的真和假,值只有 true / false。
>[success] 1. 在 Java 中是沒有表現多個字符的基本數據類型的,但是在 Java 中提供了一個 String 類,去表現字符串。
> 2. 轉義字符的使用:當你要打印無法列出的字符,比如換行符等等,要用轉義字符,還有就是一些在字符串內要搞錯的字符,總之是對編譯器來說具有特殊意義的字符。
>[info]在基本數據中,是可以進行類型之間的強制轉化的,但是要注意,如果從低精度的轉化為高精度時不會有問題,但是從高精度轉化為低精度時,可能出現精度缺失。
引用數據類型(類類型):后續講解。
### 各數據類型使用補充
1. 在Java中,數據類型分為基本數據類型和引用數據類型(類類型)。
作為強類型語言,Java在編譯時,會進行嚴格的語法檢查,每個變量在編譯時,就確定了其類型。所有變量必須顯式地聲明類型,而且必須聲明后使用。
2. 數據類型分類圖示:

3. 浮點類型的使用
* 因為Java浮點數使用二進制數據的科學計數法來表示,因此不能精確的表示一個浮點數。如5.2345556f賦值給float類型的變量,輸出的時候會發生變化,即使用精度更高的double類型,有時這個問題依然會出現。如果開發者希望精確的保存一個浮點數,可以使用BigDecimal類。
* Java語言默認的浮點類型時double。如果希望把一個數當做float類型處理,應該在浮點值后面緊跟f或F,double類型可以d或D,但是沒有必要。
4. 基本類型的類型轉換
在Java程序中,不同的基本類型的值,經常需要進行互相轉換。Java語言中提供的7種數值類型之間可以互相轉換,有兩種類型轉換模式:自動類型轉換和強制類型轉換。
* **自動類型轉換**
把某種基本數據類型的值,直接賦值給其他基本數據類型的值
>[danger] 如果把范圍小的數據,賦值給范圍大的數據時,不會出現精度的缺失;反之,則可能會出現精度的缺失。

~~~Java
//示例
class Client1 {
public static void main(String[] args) {
int i = 100;
double di = i;
//int a = di;
System.out.println(di);
}
}
~~~
注意:
>[danger] 1.上方代碼左邊轉為右邊的數據類型是沒有問題的;
> 2.當把任何基本數據和字符串,進行連接運算的時候,基本數據類型將自動轉換為字符串類型。
* **強制數據類型轉換**
如果需要把上方代碼中的右邊,轉換為左邊時,則成為強制類型轉換。
語法:`(targetType)value `
強制類型轉換時,需加上()運算符。
**強制類型轉換也許會出現精度的缺失或溢出的情況。**
~~~
示例:
int i = 150;
byte b = (byte)i;
System.out.println(b);
int i2 = 100;
byte b2 = (byte)i2;
System.out.println(b2);
String s = "56";
int si = Integer.parseInt(s);
System.out.println(si);
~~~
**如果希望把String類型的數據,強制轉為基本數據類型,可以使用基本數據對應的包裝類實現。**
5. 表達式的自動提升
當一個表達式中包含多個基本數據類型的值時,整個算術表達式的數據類型將發生自動提升。
提升規則:
所有的byte/short/char類型將被提升到int;
整個算術表達式的數據類型,將被提升到與表達中最高等級操作數相同的類型。
~~~
示例:
char t1 = 'a';
short t2 = 100;
int t3 = 45;
double t4 = 10.5;
System.out.println(t1 + t2 + t3 + t4);
~~~
**如果表達式包含字符串,應當把+號,當做字符串連接運算符,而不是加法運算符。**
## 習題
1. 分別為如下值,找到合適的類型來定義
~~~
3.14
2.769343
365
12
'吃'
false
"不可描述"
~~~
比如3.14就使用double
`double a = 3.14;`
2. 練習-類型轉換
~~~
short a = 1;
short b = 2;
~~~
那么`a+b`是什么類型?