# 数据类型
[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. 数据类型分类图示:
![](https://img.kancloud.cn/0d/41/0d417fe968b0c28d6a3ad466651225fd_527x251.png)
3. 浮点类型的使用
* 因为Java浮点数使用二进制数据的科学计数法来表示,因此不能精确的表示一个浮点数。如5.2345556f赋值给float类型的变量,输出的时候会发生变化,即使用精度更高的double类型,有时这个问题依然会出现。如果开发者希望精确的保存一个浮点数,可以使用BigDecimal类。
* Java语言默认的浮点类型时double。如果希望把一个数当做float类型处理,应该在浮点值后面紧跟f或F,double类型可以d或D,但是没有必要。
4. 基本类型的类型转换
在Java程序中,不同的基本类型的值,经常需要进行互相转换。Java语言中提供的7种数值类型之间可以互相转换,有两种类型转换模式:自动类型转换和强制类型转换。
* **自动类型转换**
把某种基本数据类型的值,直接赋值给其他基本数据类型的值
>[danger] 如果把范围小的数据,赋值给范围大的数据时,不会出现精度的缺失;反之,则可能会出现精度的缺失。
![](https://img.kancloud.cn/36/84/368479df5eabc11340660eadfe832566_521x99.png)
~~~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`是什么类型?