一、Java的数据类型
Java是一门强类型的编程语言,它不同于一些弱类型的语言(JavaScript、Python、PHP...)变量的类型一旦确定,则无法修改,在Java中数据类型主要包括以下两大类:
- 基本数据类型:包括整数、浮点、字符、布尔类型。
- 引用数据类型:包括类、数组、集合、接口等。
1、基本数据类型
- 整数型 默认值为0
数据类型 | 关键字 | 字节长度 | 数值范围 |
---|---|---|---|
字节型 | byte | 1个字节 | -128~127 |
短整型 | shrot | 2个字节 | -32768·32767 |
整型 | int(默认0 | 4个字节 | -2的31次方~-2的31次方-1 |
长整型 | long | 8个字节 | -2的63次方~2的63次方-1 |
-
long(8字节=64bits)long类型数据在赋值时必须在数据值末尾追加一个“L”(大写)
-
浮点型 默认值0.0
数据类型 | 关键字 | 字节长度 | 范围 |
---|---|---|---|
单精度 | float | 4个字节 | 1.4013E-45~3.4028E+38 |
双精度 | double(默认) | 8个字节 | 4.9E-324~1.7977E+308 |
-
float(4字节=32bits)float类型数据在赋值时,必须在末尾追加“f”或“F”
-
布尔型 默认值false
数据类型 | 关键字 | 字节长度 | 范围 |
---|---|---|---|
布尔类型 | boolean | 1个字节 | true false |
关于char类型
“”在java中是一个转译符号,可以将斜杠之后的内容转译为特殊符号,如:
换行
制表符
退格
注意事项
在对浮点数操作时。可能会由于计算机进行运算时精度丢失问题,导致实际结果跟预期结果不一致,例如:
//对于两个double类型/float类型的数计算,由于计算机在计算时会缺失精度
//不是预期的0.3,建议对于浮点数计算使用java.math.BigDecimal(引用数据类型)
double d1=0.1;
double d2 = 0.2;
double d3 = d1 + d2;
System.out.println(d3);//实际结果为:0.30000000000000004 而非预期的 0.3
float f1=0.2f;
float f2=0.3f;
float f3=f1-f2;
//结果 -0.10000000001
System.out.println(f3);
因此,在涉及到一些比较敏感的(金额)浮点数据时,不能够使用double或者float;在实际项目中对于这些敏感的浮点数会使用Java.math.BigDecimal(引用数据类型)
2、引用数据类型
java中的数据类型除了8基本类型数据外,其余的数据类型都是引用类型,常用的引用类型:类,数组,接口等
以 类 举例
创建学生类 在一个类中会包含一些变量(全局变量)和一些方法
public class Student{
//定义的一个字符串变量
String stuname=“张三”;
char sex='男';
int age=20;
//定义一个方法
public void showInfo(){
System.out.println(syuname);
System.out.println(sex);
System.out.println(age);
}
}
如何使用这个学生类型(引用数据类型)
public static void main(String[] args){
//定义学生类型 引用数据类型需要创建 引用对象
//引用数据类型 变量名= null
//基本数据类型 变量名=初始值
//对于类的创建
//类名 对象名 = new 类名();
student stu= new Student;
//对象名。方法名();
stu.showInfo():
}
引用数据类型和基本数据类型的区别?
- 创建方式不同,基本数据类直接通过定义变量的方式创建,而引用数据类型需要new一个对象
- 在JVM的内存分配不同,基本数据类型的内存在栈内存中直接创建,而引用数据类型是在栈内存中定义引用的地址,实际的内存分布在堆内存中
- 引用数据类型,可以调用它的方法,而基本数据类型没有
引用数据类型的内存分布图
基本数据类型的内存分布图
二、java的数据类型的转换
为什么需要数据类型转换?
在Java中数据进行计算时,必须要求计算的元素的数据类型一致,如果数据类型不一致需要进行转换
数据转换分类
1、自动类型转换
转换规则:范围小的类型向范围大的类型(从小到大)
byte—>short—>int—>long—>float—>double
布尔类型不参与转换
2、强制转换类型
- 整数与整数之间的强转
public static void main(String[] args) {
//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 小数会丢失精度0
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);
三、Java的字符和ASCLL码表
字符 | int值 |
---|---|
a | 97 |
A | 65 |
0 | 48 |
依次小写字母往后都是数字,例如b为98,C为99... | |
A:65 B:66 C:67 0:48 1:49 2:50 ..... |
- 字符与数据的转换
public static void main(String[] args) {
//int 与 char类型的转换
//每一个char类型都有一个ASCll码表
char c='a';
//自动提升:因为char类型占2个字节 int占4个字节
int n=c;
System.out.println(n);
//先相加 在转换
char c2=(char)(n+2); //需要强转
//字符+字符
char c3='a'+'b';
System.out.println((int)c3);
}