1. 变量的介绍
- 一个程序就是一个世界,变量用来描述这个世界里有什么,包含什么。
- 变量是程序的基本组成单位
变量的三要素:类型、名称、值。
eg:
int i =0;
int b = 3;
Jvm在执行定义语句时,会在内存为变量开辟一个空间,每个开辟的变量空间在内存上是用地址来体现。
b = 89;
Jvm在执行赋值语句时,将原来变量空间的值进行替换。
1.00 变量的介绍
- 概念:变量相当于内存空间中的一个数据存储空间的表示,可以把变量认为是一个房间的门牌号,通过门牌号我们能很快找到这个房间。
而通过变量名,我们可以访问到这个变量(值) - 使用步骤: 声明——赋值——使用,一般前两步一起用:
int a = 50;
1.0.1 变量的使用注意事项
- 变量表示内存中的一个存储区域【不同的变量,类型不同、占用内存大小不同】。
- 该区域有自己的名称【变量名】和类型【数据类型】。
- 可以在同一类型范围内不断的变化。
2. +号的使用
- 拼接字符串
3. 数据类型
java是强类型语言:“强类型语言也称为强类型定义语言。是一种总是强制类型定义的语言,要求变量的使用要严格符合定义,所有变量都必须先定义后使用。
Java8种基本数据类型:
- 数值型:byte[1]、short[2]、int[4]、long[8] 。 - 浮点型:float[4]单精度、double[8]双精度。 - 字符型 char[2] :存放单个字符 'a' 。 - 布尔型 boolean[1]:存放true,false。
Java3种引用数据类型:
- class类
- interface 接口
- Arrays 数组
整数类型
类型 | 占用内存空间 | 范围 |
---|---|---|
byte【字节】 | 1字节 | -128 ~127 【-2^8 ~ 2^7 - 1】 |
short【短整型】 | 2字节 | -32768 ~32767 【-2^16 ~ 2^15 - 1】 |
int【整型】 | 4字节 | -2147483648 ~2147483647 【-2^32 ~ 2^31 - 1】 |
long【长整型】 | 8字节 | 【-2^64 ~ 2^63 - 1】 |
- java的整型类型不受操作系统的影响,保证了java的可移植性。
- Java的默认整型类型为int,声明long必须后边加"l"或"L"。
- bit是计算机中的最小存储单位,byte是计算机中基本存储单元,1 byte = 8bit。
浮点类型
- 浮点的分类
类型 | 占用内存空间 | 范围 |
---|---|---|
单精度 | 4字节 | -3.403E38 ~ 3.403E38 |
双精度 | 8字节 | -1.798E308 ~ 1.798E308 |
浮点数在计算机中存放形式:浮点数 = 符号位 + 指数位 +尾数位
尾数部分可能丢失,造成精度损失(小数都是近似值)
- java的浮点常量默认为double型,声明float型常量,要在常量后加“f”或“F”
// (错误的,浮点数默认类型是double,不可以将8个字节的数字存放在4字节的变量中)
float ff = 1.1;
// 正确写法:
float ff = 1.1f;
- 等价关系
double dd = .123;
// 等价于
double dd = 0.123;
- 科学计数法
5.12e2 = 5.12 * 10的2次方
5.12E-2 = 5.12 / 10的2次方
- 通常情况下,我们用double,因为精度比float高。
double dd = 2.1234567821;
// 会丢失尾数位
float ff = 2.1234567821F;
- 浮点数陷阱(精度损失)
double d1 = 2.7;
double d2 = 8.1 / 3; // 输出一个2.7的近似值。
System.out.println(d1 == d2);
// 返回false
- 扩展:那么如何判断浮点数是否相同呢?
double num1 = 2.7;
double num2 = 8.1 / 3;
System.out.println(Math.abs(num2 - num1) > 0.00001);
字符型
- 字符型本质:
在Java中,char的本质是一个整数,在默认输出时,是unicode码对应的字符。
要输出对应的数字,可以(int)字符。
- 字符型的使用:
用’ '引起来的。
- 字符型可以进行运算。
'a'+10;
// 结果是107。
4. 编码
- Ascll编码表一共128个字符。
- UTF-8编码:字母占1个字节,汉字占3个字节。
boolean类型
- 特点:
只有两个值: true、false;
5. 基本数据类型转换
- 自动类型转换:
java中精度小的数据类型可以自动转换为精度大的数据类型。
- 数据类型按精度(容量排序)
- char ==> int ==> long ==> float ==> double
- byte ==> short ==> int ==> long ==> float ==> double
// 将低精度的char[2]赋值给高一级的int[4] 编译通过;
int temp = 'a';
// 将低精度的int[4](整型),高精度的double[8](双精度浮点型) 编译通过
- 自动转换注意和细节
- 多种数据类型进行运算时:自动转换成精度最高(容量最大)的那种类型再进行运算。
- 把高精度值赋给低精度编译会报错。
- byte、short、char之间不进行自动转换。只要运算中有这3者,运算结果会自动转换成inti
byte b = 10;
char car = b; // 编译不通过,不可以自动转换。
short sot = 10;
short sot2 = b + sot; // 编译不通过, byte和short相加结果会转换成int
- 当把一个具体的数赋给byte时,编译器首先会判断这个数在不在byte的容量内(-127 ~ 128),是的话编译通过。
当把一个变量赋给byte时会先判断类型,如果精度(容量)大于byte则编译错误。
byte b = 10; // 通过
int x = 2;
byte b = x; // 编译错误
- boolean不参与自动转换。
大精度转换成小精度的变量时会使用到。
- 需要注意精度损失和数据溢出(慎用!!)
- 强转符号(),只对最近的操作数起作用,用小括号提升优先级。
int num = (int)(10 * 3.5 + 6 * 1.5)
6. 基本数据类型和String之间的转换
- 基本数据类型转换为String
int i1 = 100;
double d2 = 10.0;
boolean b3 = true;
String str1 = i1 + ""; // 将会把i1转换为字符串输出
- String转换为基本数据类型(通过基本类型的包装类进行转换parse.XX)
String str = "100";
int i =Integer.parseInt(str);
- String转换为char类型(用str.charAt(0))
- 如果遇到转换不了的类型就会抛出一个运行时异常(NumberFotmatException)