# 1.基本数据类型与变量

## 1.1 基本数据类型

Java属于强类型语言，强类型语言必须为每一个变量声明一种类型。



Java中基本数据类型也称做简单数据类型，包括以下八种



**1、整型**

byte 、short 、int 、long

**2、浮点型**

float 、 double

**3、字符型**

char

**4、布尔型**

boolean

 

### 1.1.1 整型

**整型（byte、short、int、long）**

整型数据有四种，它们的取值范围不同

byte 的取值范围：-128～127（-2的7次方到2的7次方-1）

short 的取值范围：-32768～32767（-2的15次方到2的15次方-1）

int 的取值范围：-2147483648～2147483647（-2的31次方到2的31次方-1）

long 的取值范围：-9223372036854774808～9223372036854774807（-2的63次方到2的63次方-1）

### 1.1.2 浮点型

浮点型包括float和double两种，区别在与精度，float是单精度、32位、符合IEEE 754标准的浮点数；double 数据类型是双精度、64 位、符合 IEEE 754 标准的浮点数。

float（单精度浮点型）取值范围：3.402823e+38～1.401298e-45

double（双精度浮点型）取值范围：1.797693e+308～4.9000000e-324

java对于浮点型数据默认会使用double。

### 1.1.3 字符类型

char 类型是一个单一的 16 位 Unicode 字符；

最小值是 **\u0000**（十进制等效值为 0）；

最大值是 **\uffff**（即为 65535）；

char 数据类型可以储存任何字符；

### 1.1.4 布尔类型

布尔类型只有两个取值，分别是true 、false 。

java默认是false。

## 1.2 变量

### 1.2.1 变量类型

java属于强类型语言，所以变量在使用前必须进行声明，以下是几个声明与赋值的示例：

```
int a, b, c;         // 声明三个int型整数：a、 b、c
int d = 3, e = 4, f = 5; // 声明三个整数并赋予初值
byte z = 22;         // 声明并初始化 z
String s = "runoob";  // 声明并初始化字符串 s
double pi = 3.14159; // 声明了双精度浮点型变量 pi
char x = 'x';        // 声明变量 x 的值是字符 'x'。
```

java有三类变量，分别是：

- 类变量：独立于方法之外的变量，用 static 修饰。
- 实例变量：独立于方法之外的变量，不过没有 static 修饰。
- 局部变量：类的方法中的变量。

```java
public class var{
    static int lei_var;    // 类变量
    String str="hello world";  // 实例变量 
    public void test(){
        int local_var =0;  // 局部变量 
    }
}
```



**局部变量**

如果在成员方法中定义一个变量，那么这个变量就被称为局部变量。

局部变量在方法实行时被创建，在方法执行结束的时候被销毁。局部变量在使用时必须进行赋值操作或被初始化，否则出现编译错误。

例如，我们创建一个类文件，在该类中定义getName()方法，在getName()方法中声明int型的局部变量id，并赋值为0，代码如下：

```java
public class BookText(){
	public String getName(){
	int id = 0; //局部变量，如果我们把初始值去掉，会报错
	setName("Java"); //调用类中的其他方法（此类中省略定义方法）
	return i + this.name;
	}
}
```

==注意：== 类成员变量和成员方法可以统称为类成员。如果一个方法中含有与成员变量同名的局部变量，则方法中对这个变量的访问以局部变量的值为基准。例如，变量id在 getName()方法中值为0，而不是成员变量中id的值。

局部变量的作用域，即局部变量的有效范围，下图描述了局部变量的作用范围。

```java
public void doString(String name){ 
	int id = 0; 
	for(int i = 0; i< 10; i++) 
		System.out.println(name + String.valueOf(i));
}
```



在相互不嵌套的作用域中可以同时声明两个名称和类型相同的局部变量，如下图

```java
public void doString(String name){
	 int id = 0; 
	 for(int i= 0; i<10; i++){
	 	 System.out.println(name ＋ String.valueOf(i)); 
	 	 }
	 for (int i= 0; i <3; i++)
	 	System.out.println(i);
}
```



但是在相互嵌套的区域中不可以这样声明，如果将局部变量id在方法体的for循环中再次定义，编译器将会报错，如图所示。

```java
public void doString(String name){ 
	int id = 0; 
	for(int i= 0; i<10; i++)
		System.out.println(name + String.valueOf(i));
	for(int i = 0; i<3; i++)
		 System.out.println(i); int id = 7;
}
```

==注意：== 在作用范围外使用局部变量是一个常见的错误，因为在作用范围外没有声明局部变量的代码。





**实例变量**

也叫类成员变量，声明在一个类当中，方法、构造方法和语句块之外。实例变量的生命周期与对象一致。



**类变量/静态变量**

类变量也称为静态变量，在类中以 static 关键字声明，但必须在方法之外。无论一个类创建了多少个对象，类只拥有类变量的一份拷贝。生命周期与类一致。



### 1.2.2 类型转换

​	在平时编程的时候，经常需要将一种数值类型转换为另一种数值类型。

![数值类型之间的合法转换](img/i0.hdslb.com&app=2002&size=f9999,10000&q=a80&n=0&g=0n&fmt=jpeg)

- 若两个操作数中有一个是double类型，另一个操作数就会转换为double类型；
- 若其中一个操作数是float类型，另一个操作数也会转换为float类型；
- 若其中一个操作数为long类型，另一个操作数也会转换为long类型；
- 否则两个操作数都会转换为int类型。

​	数值类型的转换可能会发生精度的丢失，例如：123456789是一个大整组，它所包含的位数比float类型所能表达的位数还要多。当它由整型数值转换为float类型时，将会得到同样大小的结果，但却丢失一定的精度。

```java
int n = 123456789;
float f = n;
System.out.println(f);
```

输出：1.23456792E8



**强制类型转换**

​	由上方可看出，在必要时候int类型会自动转换为double类型，而也会有将double类型转换为int类型的需要。这时，就需要通过*强制类型转换*来实现这个操作。

​	强制类型转换的语法格式是在**圆括号中给出想要转换的目标类型，后面紧跟着待转换的变量名**。

```java
double x = 9.997;
int nx = (int)x;
```

​	在这里，变量nx的值就会变成9。强制类型转换通过截断小数部分将浮点值转换为整型。

​	若想要对浮点数进行舍入运算，以便得到最接近的整数，就需要用Math.round方法：

```java
double x = 9.997;
int nx = (int) Math.round(x);
```

​	现在变量nx的值为10。



### 1.2.3 常量

常量在程序运行时是不能被修改的。

在 Java 中使用 final 关键字来修饰常量，声明方式和变量类似：

```
final double PI = 3.1415927;
```

虽然常量名也可以用小写，但为了便于识别，通常使用大写字母表示常量。

字面量可以赋给任何内置类型的变量。例如：

```
byte a = 68;
char a = 'A'
```

byte、int、long、和short都可以用十进制、16进制以及8进制的方式来表示。

当使用字面量的时候，前缀 **0** 表示 8 进制，而前缀 **0x** 代表 16 进制, 例如：

```
int decimal = 100;
int octal = 0144;
int hexa =  0x64;
```

和其他语言一样，Java的字符串常量也是包含在两个引号之间的字符序列。下面是字符串型字面量的例子：

```
"Hello World"
"two\nlines"
"\"This is in quotes\""
```

字符串常量和字符常量都可以包含任何Unicode字符。例如：

```
char a = '\u0001';
String a = "\u0001";
```



## 1.3 枚举类型

​	有时候，变量的取值只在一个有限的集合内，这个变量中很可能保存错误的值。针对这种情况，可以自定义枚举类型。枚举类型包括有限个命名的值。

> 例如：
>
> 销售服装的尺寸有小、中、大和超大四种尺寸。
>
> ```java
> enum Size {SMALL, MEDIUM, LARGE, EXTRA_LARGE};
> //声明这种类型的变量
> Size s = Size.MEDIUM;
> ```
>
> Size类型的变量只能存储这个类型声明中给定的某个枚举值，或null值。null表示这个变量没有设置任何值。

