三、Java的数据类型
Java是一门强类型的编程语言,它不同于一些弱类型的语言(JavaScript ,php,python),Java在声明变量时必须显示的定义变量的数据类型,变量的类型一旦定义,则不能改变 。Java中数据类型分为两大类
1、基本数据类型 : 包括 整数,浮点,字符,布尔类型等
2、引用数据类型 :包括 类,数组,集合,接口等
1、基本数据类型
- 整数型 ,默认值为0
数据类型 | 关键字 | 字节长度 | 数值范围 |
---|---|---|---|
字节型 | byte | 1个字节=8位 | -128~127 |
短整型 | short | 2个字节=16位 | -32768~32767 |
整型 | int(默认) | 4个字节=32位 | -2的31次方 ~2的31次方-1 |
长整型 | long | 8个字节=63位 | -2的63次方~2的63次方-1 |
-
浮点型,默认值为0.0
数据类型 关键字 字节长度 范围 单精度 float 4个字节 1.4013E-45~3.4028E+38 双精度 double 8个字节 4.9E-324~1.7977E+308 -
字符型 默认值 ‘ ’
数据类型 关键字 字节长度 范围 字符型 char 2个字节 0~65535 一个字符能存放一个中文汉字
-
布尔型 默认值 false
数据类型 关键字 字节长度 范围 布尔类型 boolean 1个字节 true、false 注意:
// 对于两个double类型/float类型的数计算, 由于计算机在计算式会缺失精度,计算的结果 //不是预期的0.3,建议对于浮点数计算式,使用java.math.BigDecimal引用数据类型计算 double d1 =0.1; double d2 = 0.2; //结果 0.30000000000000004 double d3 = d1 + d2; System.out.println(d3); float f1 =0.2f; float f2 = 0.3f; float f3 = f1-f2; // 结果 -0.1000000000001 System.out.println(f3);
对于字符类型中 "\ " 表示转移字符,不会占用内存
\n :换行
\t : 一个制表符tab
\b: 表示退格
\r: 表示enter
2、引用数据类型
在Java中除了8个基本数据类型以外的数据类型,都是引用数据类型 ,常用的引用数据类型 包括 类、数组、 接口,String 等
以类 举例
创建一个学生类 ,在一个类中会包含一些 变量(全局变量),还包含一些方法
定义一个学生类,这个类就是引用数据类型
public class Student{
// 定义的一个字符串变量
String stuname="张三";
char sex= '男';
int age = 20;
// 定义一个方法
public void showInfo(){
System.out.println(stuname);
System.out.println(sex);
System.out.println(age);
}
}
如何使用这个学生类型(引用数据类型)
public static void main(String [] args){
// 定义学生类型 ,引用数据类型需要创建 引用的对象
// 引用数据类型 变量名 = null
// 基本数据类型 变量名 = 初始值
// 对于类的创建
// 类名 对象名 = new 类名();
Student stu = new Student();
// 对象名.方法名();
stu.showInfo();
}
引用数据类型与基本数据类型的区别?
1、创建方式不同 ,基本数据类直接通过定义变量的方式创建, 而引用数据类型需要new一个对象
2、在JVM的内存分配不同, 基本数据类型的内存在栈内存中直接创建 , 而引用数据类型是在栈内存中定义引用的地址,实际的内存分布在堆内存中
3、引用数据类型 可以调用它的方法, 而基本数据类型没有方法
四、Java的数据类型的转换
为什么需要进行数据类型转换
在Java中数据进行计算时 ,必须要求计算的元素的数据类型一致,如果数据类型不一致需要进行转换
数据转换分类
1、自动类型转换
转换规则: 范围小的类型向范围大的类型转换(从小到大转换)
byte -> short -> int-> long -> float -> double 其中boolean类型不参与转换
char ->int
转换原理: 类型向上提升
2、强制类型转换
- 整数之间的强转
// int 类型
int i=1;
// byte 类型
byte j=100;
// 由于i和j 不同类型,不能直接计算,程序会自动将j的类型向上提升为 int
// 所以i +j 之后依然是 int 类型
// 此时 int 的内存 大于 byte 的内存,会出现数据溢出的情况 ,JVM不允许
// byte s = i + j ; // 等号两遍类型不匹配
int y = i + j ;
System.out.println(y);
// 如果一定要使用byte赋值,还有一种办法,就是将两遍类型一致
byte s = (byte)(i + j) ; // 两个数在相加时 会先自动提升为int 然后再相加
- 整数与小数之间的强转
// 整数和小数之前 也会丢失精度
int n2 = 100;
double n3 = 3.5;
int n4 = (int)(n2 + n3);
// 相加时先提升为 double ,然后相加后得到 double
// double是8个字节 不能放在4个字节的长度中,
// (这里好比double 为一桶水, int为一杯水,相当于将一桶水往一杯水中放)
// 只能留住一本水的内容,所以 这里 如果强转成int 则小数会丢失,
System.out.println(n4);
- 小数和小数之间的强转
// float 与 double 类型
float f1 = 3.14f;
double d2 = 3.5;
double dd = f1+d2;
float ff = (float)(f1 + d2);
- 丢失精度的情况
// 强转时会丢失精度
byte n=100;
int m = 30;
byte mm = (byte)( n + m); // 因为最大值为127 再往后就是从最小值开始-128
System.out.println(mm);
// 整数和小数之间 也会丢失精度
int n2 = 100;
double n3 = 3.5;
int n4 = (int)(n2 + n3);