数据类型 & 类型转换
一、数据类型
1. 常用基本数据类型
数据类型 | 关键字 | 内存占用 | 取值范围 |
---|---|---|---|
整数类型 | byte | 1 | -128 ~ 127 |
short | 2 | -32768 ~ 32767 | |
int | 4 | - 2147483648 ~ 2147483647 | |
long | 8 | -9223372036854775808 ~ 9223372036854775807 | |
浮点类型 | float | 4 | 负数:-3.402823E+38到-1.401298E-45 正数:1.401298E-45到3.402823E+38 |
double | 8 | 负数:-1.797693E+308到-4.9000000E-324 正数:4.9000000E-324到1.797693E+308 | |
字符类型 | char | 2 | 0 ~ 65535 |
布尔类型 | boolean | 1 | true , false |
1.1 说明
- E+38: 乘以 10^38,其他同理
- E-38 :乘以 10^-38,其他同理
- 整数默认是int类型
- 浮点数默认是double类型
- long类型赋值时需要在数字后加上 L
- float类型赋值时需要在数字后面上上 F
1.2 代码示例
public class 数据类型 {
public static void main(String[] args) {
//整数
int num1 = 10; //最常用
byte num2 = 20;
short num3 = 30;
long num4 = 30L;//Long类型要在数字后面加个L
//小数;浮点数
float num5 = 30.1F; //float类型要在数字后面加个F
double num6 = 3.14159;
//字符
char name = '中'; //占两字节
//类String不是关键字
//String name = "中国";
//布尔值:是非
boolean flag = true;
//boolean flag = false;
}
}
1.3 拓展<代码示例>
1.3.1 整数拓展
public class IntegerDemo {
public static void main(String[] args) {
//进制
int i = 10; //十进制
int i2 = 010; //八进制 0
int i3 = 0x10; //十六进制 0x 0-9 A-F
int i4 = 0b10; //二进制 0b
System.out.println(i); //10
System.out.println(i2); //8
System.out.println(i3); //16
System.out.println(i4); //2
}
}
1.3.2 浮点数拓展
public class DoubleDemo {
//银行业务怎么表示
//BigDecimal 数字工具类
//最好完全避免使用浮点数进行比较
public static void main(String[] args) {
float f = 0.1f; //0.1
double d = 1.0/10; //0.1
System.out.println(f==d); //false
float d1 = 12345646546f;
double d2 = d1 + 1;
System.out.println(d1==d2); //ture
//浮点数 有限 离散 舍入误差 大约 接近但是不等于
}
}
1.3.3 字符拓展
public class CharDemo {
public static void main(String[] args) {
char c1 = 'a';
char c2 = '中';
System.out.println(c1);
System.out.println((int)c1); //强制转换
System.out.println(c2);
System.out.println((int)c2); //强制转换
//所有的字符本质还是数字
//编码 Unicode表 (97 = a 65 = A) 2字节 0-65536
//U0000-UFFFF
char c3 = '\u0061'; //61为16进制
System.out.println(c3); //a
}
}
1.3.3.1 常用的转义字符
转义字符 | 功能 |
---|---|
\t | 一个制表位,实现对齐功能 |
\n | 换行 |
\\ | 输出一个 \ |
\" | 输出一个 " |
\’ | 输出一个 ’ |
\r | 表示一个回车,使光标回到当前行的行首。如果之前该行有内容,则会被覆盖; |
1.3.4 布尔拓展
public class BooleanDemo {
public static void main(String[] args) {
boolean flag = true;
if (flag == true) { }
if (flag) { }
// 二者意义相同
// less is More 代码要精简易读
}
}
2. 引用类型
2.1 类
2.2 接口
2.3 数组
二、类型转换
1. 数据范围排序<从小到大>
2. 自动类型转换
2.1 概述
- 把一个表示数据范围小的数值或者变量赋值给另一个表示数据范围大的变量。这种转换方式是自动的,直接书写即可
2.2 代码示例
public class 类型转换 {
public static void main(String[] args) {
//自动转换 低 --> 高
int i = 128;
double b = i;
System.out.println(i); //128
System.out.println(b); //128.0
}
}
3. 强制类型转换
3.1 概述
-
把一个表示数据范围大的数值或者变量赋值给另一个表示数据范围小的变量。
-
强制类型转换格式
-
目标数据类型变量名= (目标数据类型)值或者变量
-
3.2 代码示例
public class 类型转换 {
public static void main(String[] args) {
//强制转换 (类型)变量名 高 -->低
int i = 128;
byte b = (byte)i;
System.out.println(i); //128
System.out.println(b); //-128 内存溢出 byte字节范围为 -128-127
}
}
4. 注意事项
-
不能对 布尔值 进行转换
-
不能把对象类型转换为不相干的类型
-
在把高容量转换到低容量的时候,强制转换,转换的时候可能存在内存溢出或是精度问题
-
精度问题
System.out.println((int)23.3) //23
-
溢出问题
public class 溢出问题 { public static void main(String[] args) { //操作比较大的数的时候,注意溢出问题 //JDK7新特性,数字之间可以用下划线分割 int money = 10_0000_0000; int years = 20; int total = money*years; System.out.println(total); //-1474836480,计算的时候溢出了 } } =========================================================================== public class 溢出问题 { public static void main(String[] args) { int money = 10_0000_0000; int years = 20; long total = money*years; //默认是int,转换之前已经存在问题 System.out.println(total); //-1474836480 } } ============================================================================ public class 溢出问题 { public static void main(String[] args) { int money = 10_0000_0000; int years = 20; long total = money*(long)years; //先把一个数转换成Long System.out.println(total); //20000000000 } }
-