05-数据类型和类型转换
这篇文章为你搞懂2个问题
- java 中有哪些数据类型可以用存储数据?
- java 中的数据类型是怎么转换的?
在上一篇文章中我们学会了如何使用变量,像这样存储一个整数 int age=10;
,可以在开发工具中编写一行这样的代码 int age=10.5;
就会发现开发工具报错了,是因为变量中的数据类型也是不能随便用的。
数据类型
咱们先来看下面一组数据
如果每天花费2小时在交通上
1月=60小时=2.5天,
1年=730小时=30天,
50年=36500小时=1520天=4年
这段数据中可以分为以下2类,java中也包含这2大类
- 数值
1月
中的1
60小时
中的60
2.5
天中2.5
- 非数值
,
年
月
小时
- 数值
- 整型
- byte
- short
- int
- long
- 浮点型
- float
- double
- 整型
- 非数值
- char
- boolean
- String
数值型
下面看一下每个数据类型的详细介绍
数据类型 | 大小 | 取值范围 | 介绍 |
---|---|---|---|
byte | 1字节8位 | -128 ~ +127 | 字节型 这个范围可以存储普通人的年龄 |
short | 2字节16位 | -32768~+3276 | 短整型 |
int | 4字节32位 | -2147483648)~+2147483647 | 整型 存下中国人口的数量没有问题,但是存下地球所有人的数量就不够了 |
long | 8字节64位 | -263 ~ + 263-1 | 长整型 存下地球的人数绰绰有余 |
float | 4字节32位 | 单精度浮点数 存储小数 | |
double | 8字节64位 | 双精度浮点数 |
敲一敲:
public class DemoType {
public static void main(String[] args) {
//int类型使用
int numa=10+1;
System.out.println(numa);//输出11
short numb=20;
//使用long类型时的值需要使用L作为后缀
long time=9223372036854775807L;
}
}
在使用 long 类型时使用不区分大小写的 L 作为后缀标记与整型进行区分
使用其他整数时不需加后缀符号,注意赋值的整数不超过类型范围即可
敲一敲:
public class DemoFloat {
public static void main(String[] args) {
float money=33.6f;
double length=55.07;
}
}
在使用单精度浮点数时需加上
f
作为后缀,这是因为任何小数都会被认为是double
在日常使用中建议使用double
类型防止精度的丢失
非数值型
字符型 char
只能存储一个字符,值需要用一对单引号引起来,且单引号中只能放一个字符
敲一敲:
char sex='男';
字符串型 String
用于存储一串字符,必须用一对双引号引起来,另外需要注意的是 String 不是基本数据类型,而是 java 中的另一个概念 类
。
敲一敲:
String username="极客大全";
String question="What's your name?\nHow old are you?";
String
类型用于存储字符串,字符串可以拼接但不能用于数学运算- 还可以使用一些
转义字符
,这些字符可以用来表示一些特殊符号像 空格、换行
\n
可以用来表示换行,之后的内容会另起一行
\t
可以表示一个制表符(Tab
键)
布尔型 boolean
用于存储逻辑的结果,如:大象比人大的结果是真(true
) 人比蚂蚁小的结果是假(false
)
敲一敲:
boolean isbig=(1>10);
System.out.println("isbig:"+isbig);
boolean isequal=(100==3);
System.out.println("isequal:"+isbig);
boolean flag=false;
System.out.println("flag:"+flag);
boolean
类型的变量只能存储两个值true
或false
还可以将逻辑比较后的结果(也是true
或false
)存入
数据类型转换
隐式类型转换
二花一个月前称的体重为97.5斤,现在比一个月前刚好增加2斤,二花现在是多少斤?这是一个比较简单的数学问题,正确结果是 99.5 斤,下面我们用代码来模拟一遍。
敲一敲:
public class DemoClac {
public static void main(String[] args) {
double weight=97.5;//一个月前的体重
int add=2;//增加的体重
double sum=weight+add;
System.out.println(sum);//输出和
}
}
add 变量是一个整数类型,而 weight 是一个小数,两者在相加后转成了 double类型
这时发生的就是隐式类型转换
隐式类型转换
就是自动类型转换,满足以下两个规则即可发生
- 如果一个操作数为double类型,则整个表达式可提升为double类型
像上面的这个示例就是满足这个规则
- 满足自动类型转换的条件:两种类型要兼容、目标类型大于源类型
例子1 :double a=1;
1属于整型,double 类型大于整型,即自动转换
例子2 :
char chr=97;
System.out.println(chr);//输出字符 a
char 类型兼容 int 类型,每个整数存入char类型变量时都会映射一个字符,更多可以百度 ASCII
强制类型转换
敲一敲:
int sum=55.3+22;
System.out.println(sum);
我们想要一个整数的和,但上面的这段代码运行时会报错:cannot convert from double to int
这是为什么呢?根据前面学到的隐式类型转换,当表达式中有操作数为 double类型时,整个表达式提升为 double,必须进行显式强制类型转换。
敲一敲:
int sum=(int) (55.3+22);
System.out.println(sum);
这次的运行成功,运行的结果为 77
强制类型转换往往是从宽度大的类型转换为宽度小的类型,会使数值损失精度
试一试
- 下面运算的结果是多少?为什么?
int a=5;
int b=2;
int c=a/5;
System.out.println(c);
- 上一个练习中的代码如何让运算结果更精准?
- 下面素材中生成随机小数,修改素材生成 1-10 的随机整数
public class DemoRandom {
public static void main(String[] args) {
double random=Math.random();
System.out.println(random);
}
}
鼓励你在留言中发布自己的答案,与其他人一起交流,并在百度上搜索相关问题