变量
初始的的必要性
变量在声明后不可以直接使用,而是需要经过初始化,原因是只有声明而没有初始化的变量在‘编译’时会被丢弃,不会开辟新的空间,那么在后续语句中使用时就无法找到改变量
数据类型的转换
首先Java对于整数默认用 int 接收,浮点数用 double 接收。
long num = 10; //正确
float num = 0.1; //错误
显然此处需要发生数据类型的转换,数据类型转换有两种,分别是‘自动类型转换’和‘强制类型转换’,这里有一处我以前学习时没有的思考,之前只是单纯的使用强制类型转换来得到自己想要的类型,而其实自动类型转换是将‘范围小’的类型转换为‘范围大’的类型,而强制类型转换则反过来将‘范围大’的类型转换为‘范围小’的类型,强制数据转换由我们自己操作,这是对自动类型转换的一种功能上的补充。
在此处 int 自动转换为 long 这没有问题,而 double 转换成 float 就出现了问题,double 的范围是大于 float 的。
正确的写法应该使用‘F’或者强制类型转换
float num = 0.1F;
float num = (float)0.1;
同样的当:
long a = 11111111111; //11个1,并没有超过 long 的范围,但是产生报错,因为此时当成 int 进行检测
long a = 11111111111L; //正确
由于整型常量存储有规范性,Java可以自动识别,所以以下情况也是对的:
byte num = 127; //正确
char num = 65535; //正确
short num = 30000; //正确
值得注意的是,即使是自动类型转换这样将‘范围小’的类型转换为‘范围大’的类型也不能保证数据一定不会失真。以下3种情况是会导致数据失真的:
1.int --> float
2.long --> float
3.long --> double
原因在于 float 和 double 类型都是使用IEEE754存储的浮点数,他们的有效位数分别是 7~8 和 15~16,而 int 的最大值的有效位则有10位,long 则长得多了,在有效位上必然导致数据失真/四舍五入。
浮点数还存在的问题:浮点数虽然可以表示很大的数,但是在精度上只能表示近似值,如0.1,尤其不适合货币等计算。而且由于 float 和 double 的存储方式不一样,可能我们看的同一个数实际上却表示的不一样。如:
System.out.println(0.1); //0.100000024
System.out.println(0.1F); //0.09999999999999998
System.out.println(0.1 == 0.1F); //false
数据类型转换的衍生 – 表达式类型提升(隐式强制转换)
正常按照自动类型转换的规则,需要注意的有以下两点:
1.String类型有拼接运算,所有参与拼接运算的类型,最后表达式结果都为String。
int a = 10;
double b = 20;
String c = "abc";
//不同的运算顺序会产生不一样的结果,根据右结合性原则,先做加法则得到加法结果,先拼接运算则直接得到拼接的字
//符串
String result = a + b + c; //30abc
String result = a + c + b; //10abc20
2.仅由char/byte/short参与运算的表达式,其结果都为int。
char c1 = 'a';
char c2 = 'b';
int result = c1 + c2; //char类型由其编码值参加运算,所以char也属于数值类型(注:基本数据类型中只有 //Boolean不属于)
//char result = c1 + c2; //报错:其值为int
byte b1 = 1;
int result2 = c1 + b1;
//byte result2 = c1 + b1; //报错:其值为int
short s1 = 2;
int result3 = b1 + s1;
//short result3 = b1 + s1; //报错:其值为int
表达式
三元运算符 和 if…else…
三元运算符 和 if…else… 都是表示选择,但是 三元运算符 只能由表达式构成且返回一个值,因为其本身就是一个表达式,而 if…else… 可以写语句,三元运算符更为简洁,能用三元运算符则优先使用。可以理解为有更高需求时就出现了if …else…