前言
上一节谈到Java中的变可按数据类型分类,大致可分为基本数据类型和引用数据类型
1.基本类型
数值类型
类型 | 占用空间 | 范围 |
byte | 1个字节 | -128 ~ 127 |
short | 2个字节 | -215 ~ 215-1 |
char | 2个字节 | 0 ~ 216-1 |
int | 4个字节 | -231 ~ 231-1 |
long | 8个字节 | -263 ~ 263-1 |
float | 4个字节 | -3.403E38 ~ 3.403E38 |
double | 8个字节 | -1.798E308 ~ 1.798E308 |
布尔类型
关于布尔类型占用空间,暂时未找到确切说法,请参考https://wenku.baidu.com/view/120a2304a9ea998fcc22bcd126fff705cc175cad.html
boolean类型的变量只能为true或者false,一般都用来做条件判断
2.基本数据类型的使用和相关注意项
int
编译一下,并运行
注意,对于任何数值类型(下面的也同理),所赋值不能超过其范围!
修改代码如下
先编译
修改代码
编译
运行,可以看到结果为231-1 = 2147483647,而不是280
修改代码
编译(超过了也没有报错,视频教程里用的是byte举例,这里有些疑惑,我认为应该编译不通过的)
运行(这里也有些疑惑,为什么这里又是((231-1) + 1 = -231),然后-231+99 = -2147483549呢?我暂时猜想原因应该还是我不了解从double转换到int的机制吧!)
接下来继续修改如下(注意,这次没有用加100,而是直接给超过范围的整数!)
编译
总之就是不要超过范围啦!!!!!
byte
视频教程里举例时用的是byte类型,那么我就用一下byte来试一下,需要注意的是Java中byte的取值范围为-128~127(这个我总是记错)
编写代码
class Test2{
public static void main(String args[]){
int myMathGrade = 77;
System.out.println("MathGrade: "+myMathGrade);
byte testByte1 = 123+9;
System.out.println("testByte1: "+testByte1);
}
}
命令行编译
修改代码
class Test2{
public static void main(String args[]){
int myMathGrade = 77;
System.out.println("MathGrade: "+myMathGrade);
byte testByte1 = (byte)(123+9);
System.out.println("testByte1: "+testByte1);
}
}
编译并运行
float、char、long
关于这些不一一列举了,就是float和long需要注意赋值的数字后带相应的标记字母,然后char型有好几种写法以及常用的转义字符,同时还需要注意char类型的范围(和C语言里面也不一样!)
boolean
就是注意和C的区别,C里面可以这么写,这个var可以是int、bool、short、long等类型,对于bool类型,则同样是判断真假,而对于其他几个数值类型,则是判断是否非零
if (var) {
//需要执行的内容
}
而在Java里,上面的var只能是boolean类型!
略(其他内容等碰到再写)。
short
编写代码
class Test2{
public static void main(String args[]){
short a, b, c;
short d = 50;
d = 40;
a = 80, b = 21, c = -45;
}
}
编译,注意这也是和C语言不同的地方!
修改代码
class Test2{
public static void main(String args[]){
short a, b, c;
short d = 50;
d = 40;
a = 80;
b = 21;
c = -45;
}
}
编译
接下来演示一个容易犯的错误!!!修改代码如下
class Test2{
public static void main(String args[]){
short a, b, c;
short d = 50;
d = 40;
a = 80;
b = 21;
c = -45;
d = a + b + c;
}
}
编译,因为发生了自动类型转换,如short变为了int,由此产生如下错误!!!(这个下一节会写)
修改代码
class Test2{
public static void main(String args[]){
short a, b, c;
short d = 50;
d = 40 - 9;
a = 80;
b = 21;
c = -45;
d = (short)(a + b + c);
}
}
编译
3.课后疑问
我记得在keil5编写C语言控制单片机时(当时在准备第六届全国大学生起重机大赛),float类型与float类型进行运算,是自动转换为double类型的,然后就报了一些警告,如下图,那么我这里就有疑惑了,会不会Java里float与float运算也会出现自动转换为double呢?
编写测试代码如下
class Test2{
public static void main(String args[]){
short a, b, c;
short d = 50;
d = 40 - 9;
a = 80;
b = 21;
c = -45;
d = (short)(a + b + c);
float test_float_num1, test_float_num2, result;
test_float_num1 = (float) 33.8;
test_float_num2 = 56.f;
result = test_float_num2/test_float_num1;
System.out.println("result: "+result);
}
}
编译并且运行,发现没有问题
当然,除了上面容易忽略的问题,还有一个学了C语言都知道的自动转换原则:
整个算术表达式的数据类型自动提升到与表达式中最高等级操作数同样的类型
修改代码如下
class Test2{
public static void main(String args[]){
short a, b, c;
short d = 50;
d = 40 - 9;
a = 80;
b = 21;
c = -45;
d = (short)(a + b + c);
float test_float_num1, test_float_num2, result;
test_float_num1 = (float) 33.8;
test_float_num2 = 56.f;
result = test_float_num2/test_float_num1*1.;
System.out.println("result: "+result);
}
}
编译结果报错如下,因为1. 是double类型的,因此右边转换位double类型的,而左边的变量是float类型的,就报错了
4.总结
注意基本类型相关使用
(1)赋值不能超出其范围
(2)char型有好几种表示方式,记住一些常用常见的转义字符
(3)运算时存在自动类型转换,注意几种容易犯的错误(“当整个算术表达式中包含多个基本数据类型的变量时,发生数据类型提升,如所有byte类型、short类型和char类型将被提升到int类型”),并且已经以short类型自动转换为int类型说明,同时还结合自身以前比赛学习使用C语言的经验,进行对比,得出Java中多个float类型变量一起运算时不会转换为double(当然前提是没有double类型参与)
(4)注意C语言中赋值表达式之间可以逗号隔开,最后英文分号结束,而Java中不支持,每个赋值表达式都需要英文分号结束